关键词:
package com.dragon.component;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
/**
* @author Harry
* @date 2018/2/24
* Time: 14:37
* Desc: InfiniteProgressPanel
*/
public class InfiniteProgressPanel extends JComponent implements MouseListener
/**
*
*/
private static final long serialVersionUID = 1L;
protected Area[] ticker = null;
protected Thread animation = null;
protected boolean started = false;
protected int alphaLevel = 0;
protected int rampDelay = 300;
protected float shield = 0.70f;
protected String text = "";
protected int barsCount = 14;
protected float fps = 15.0f;
protected RenderingHints hints = null;
public InfiniteProgressPanel()
this("");
public InfiniteProgressPanel(String text)
this(text, 14);
public InfiniteProgressPanel(String text, int barsCount)
this(text, barsCount, 0.70f);
public InfiniteProgressPanel(String text, int barsCount, float shield)
this(text, barsCount, shield, 15.0f);
public InfiniteProgressPanel(String text, int barsCount, float shield, float fps)
this(text, barsCount, shield, fps, 300);
public InfiniteProgressPanel(String text, int barsCount, float shield, float fps, int rampDelay)
this.text = text;
this.rampDelay = rampDelay >= 0 ? rampDelay : 0;
this.shield = shield >= 0.0f ? shield : 0.0f;
this.fps = fps > 0.0f ? fps : 15.0f;
this.barsCount = barsCount > 0 ? barsCount : 14;
this.hints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
this.hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
this.hints.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
public void setText(String text)
repaint();
this.text = text;
public String getText()
return text;
public void start()
addMouseListener(this);
setVisible(true);
ticker = buildTicker();
animation = new Thread(new Animator(true));
animation.start();
public void stop()
if (animation != null)
animation.interrupt();
animation = null;
animation = new Thread(new Animator(false));
animation.start();
public void interrupt()
if (animation != null)
animation.interrupt();
animation = null;
removeMouseListener(this);
setVisible(false);
@Override
public void paintComponent(Graphics g)
if (started)
int width = getWidth();
int height = getHeight();
double maxY = 0.0;
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHints(hints);
g2.setColor(new Color(255, 255, 255, (int) (alphaLevel * shield)));
g2.fillRect(0, 0, getWidth(), getHeight());
for (int i = 0; i < ticker.length; i++)
int channel = 224 - 128 / (i + 1);
g2.setColor(new Color(channel, channel, channel, alphaLevel));
g2.fill(ticker[i]);
Rectangle2D bounds = ticker[i].getBounds2D();
if (bounds.getMaxY() > maxY)
maxY = bounds.getMaxY();
if (text != null && text.length() > 0)
FontRenderContext context = g2.getFontRenderContext();
TextLayout layout = new TextLayout(text, getFont(), context);
Rectangle2D bounds = layout.getBounds();
g2.setColor(getForeground());
layout.draw(g2, (float) (width - bounds.getWidth()) / 2,
(float) (maxY + layout.getLeading() + 2 * layout.getAscent()));
private Area[] buildTicker()
Area[] ticker = new Area[barsCount];
Point2D.Double center = new Point2D.Double((double) getWidth() / 2, (double) getHeight() / 2);
double fixedAngle = 2.0 * Math.PI / (barsCount);
for (double i = 0.0; i < barsCount; i++)
Area primitive = buildPrimitive();
AffineTransform toCenter = AffineTransform.getTranslateInstance(center.getX(), center.getY());
AffineTransform toBorder = AffineTransform.getTranslateInstance(45.0, -6.0);
AffineTransform toCircle = AffineTransform.getRotateInstance(-i * fixedAngle, center.getX(), center.getY());
AffineTransform toWheel = new AffineTransform();
toWheel.concatenate(toCenter);
toWheel.concatenate(toBorder);
primitive.transform(toWheel);
primitive.transform(toCircle);
ticker[(int) i] = primitive;
return ticker;
private Area buildPrimitive()
Rectangle2D.Double body = new Rectangle2D.Double(6, 0, 30, 12);
Ellipse2D.Double head = new Ellipse2D.Double(0, 0, 12, 12);
Ellipse2D.Double tail = new Ellipse2D.Double(30, 0, 12, 12);
Area tick = new Area(body);
tick.add(new Area(head));
tick.add(new Area(tail));
return tick;
protected class Animator implements Runnable
private boolean rampUp = true;
protected Animator(boolean rampUp)
this.rampUp = rampUp;
@Override
public void run()
Point2D.Double center = new Point2D.Double((double) getWidth() / 2, (double) getHeight() / 2);
double fixedIncrement = 2.0 * Math.PI / (barsCount);
AffineTransform toCircle = AffineTransform.getRotateInstance(fixedIncrement, center.getX(), center.getY());
long start = System.currentTimeMillis();
if (rampDelay == 0)
alphaLevel = rampUp ? 255 : 0;
started = true;
boolean inRamp = rampUp;
while (!Thread.interrupted())
if (!inRamp)
for (int i = 0; i < ticker.length; i++)
ticker[i].transform(toCircle);
repaint();
if (rampUp)
if (alphaLevel < 255)
alphaLevel = (int) (255 * (System.currentTimeMillis() - start) / rampDelay);
if (alphaLevel >= 255)
alphaLevel = 255;
inRamp = false;
else if (alphaLevel > 0)
alphaLevel = (int) (255 - (255 * (System.currentTimeMillis() - start) / rampDelay));
if (alphaLevel <= 0)
alphaLevel = 0;
break;
try
Thread.sleep(inRamp ? 10 : (int) (1000 / fps));
catch (InterruptedException ie)
break;
Thread.yield();
if (!rampUp)
started = false;
repaint();
setVisible(false);
removeMouseListener(InfiniteProgressPanel.this);
@Override
public void mouseClicked(MouseEvent e)
@Override
public void mousePressed(MouseEvent e)
@Override
public void mouseReleased(MouseEvent e)
@Override
public void mouseEntered(MouseEvent e)
@Override
public void mouseExited(MouseEvent e)
wpf实现圆形进度条(代码片段)
WPF实现圆形进度条控件名:CircularProgressBar作 者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40;VisualStudio2019;CircularProgressBar继承ProgressB 查看详情
微信小程序进度条详解progress自定圆形进度条(代码片段)
...fo最右侧显示当前进度active如果所示的动态加载显示2自定圆形进度条2.1wxml<viewclass="container"><viewclass='progress_box'><!--背景灰色--><canvasclass="progress_bg"id="canvasProgressbg"canvas-id="... 查看详情
svg的圆形进度条(代码片段)
目前发现svg实现一些动画效果是比较高效简单的。如圆形进度条,只要会stroke-dasharray与stroke-dashoffset属性基本就可以实现,而且美观。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Document</title 查看详情
composecanvas自定义圆形进度条(代码片段)
@ComposablefunCircleRing(boxWidthDp:Int,viewModel:TaskViewModel)Canvas(modifier=Modifier.size(boxWidthDp.dp),onDraw=valstrokWidth=30F//灰色背景drawArc(Color(0,0,0,15),startAngle=160f,s 查看详情
android自定义控件篇圆形进度条(代码片段)
一、效果图二、代码逻辑/***funcation:圆形进度条控件*/publicclassCircleProgressViewextendsViewprivatePaintmBackPaint,mProgPaint;//绘制画笔privateRectFmRectF;//绘制区域privateint[]mColorArray;//圆环渐变色privateintmProgress;//圆环进度(0-100)publicCircleProgressView(Co... 查看详情
解决圆形进度条progressbar的几个问题(代码片段)
Android自带的Progressbar默认就是圆形的,可以通过style属性style="?android:attr/progressBarStyleHorizontal"变成条状进度条,如下:<ProgressBarandroid:layout_width="match_parent"androi 查看详情
解决圆形进度条progressbar的几个问题(代码片段)
Android自带的Progressbar默认就是圆形的,可以通过style属性style="?android:attr/progressBarStyleHorizontal"变成条状进度条,如下:<ProgressBarandroid:layout_width="match_parent"androi 查看详情
如何只实现一个圆形进度条,直到图像被滑动加载
】如何只实现一个圆形进度条,直到图像被滑动加载【英文标题】:Howtoimplementonlyonecircularprogressbaruntilimagesareloadedwithglide【发布时间】:2021-08-2406:49:15【问题描述】:您好,我只想实现一个圆形进度动画,直到从滑行加载图像,... 查看详情
半圆形仪表盘进度条(代码片段)
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><scriptsr 查看详情
可拖拽圆形进度条组件(支持移动端)(代码片段)
.katexdisplay:block;text-align:center;white-space:nowrap;.katex-display>.katex>.katex-htmldisplay:block;.katex-display>.katex>.katex-html>.tagposition:absolute;right:0px;.katexfont:1.21em/1.2Ka 查看详情
酷炫进度条自定义seekbar(代码片段)
...似android自带的seekbar控件,2、一个水平进度条和一个圆形进度条;3、圆形进度条显示环形刻度和当前进度值;4、并且圆形进度可滑动操作;最终实现效果:废话不多说上代码:水平的进度条ÿ 查看详情
javaswing进度条
javaSwing进度条1packageio.guanghe;23importjavax.swing.*;45/*6ProgressMonitor的用法与ProgressBar相似,ProgressMonitor可以直接创建一个进度对话框7提供的构造方法:8p 查看详情
androidprogressbar(进度条)的简单使用(代码片段)
圆形进度条只需要加入ProgressBar,默认即是圆形xml文件<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">< 查看详情
newuwpcommunitytoolkit-radialprogressbar(代码片段)
概述UWPCommunityToolkit 中有一个圆形的进度条控件-RadialProgressBar,本篇我们结合代码详细讲解 RadialProgressBar的实现。RadialProgressBar是一种圆形的进度条控件,进度值用圆形中的填充色的角度来表示,进度增长,填充色按照顺... 查看详情
h5canvas实现圆形时间倒计时进度条(代码片段)
在项目中,我们会遇到需要显示进度条或者倒计时的功能,我们今天就来实现一下。一、效果展示实现效果要求:1.环形倒计时2.能够根据总时间和当前时间进行比例性的倒计时3.进度条环形能够有颜色渐变效果4.中间... 查看详情
h5canvas实现圆形时间倒计时进度条(代码片段)
在项目中,我们会遇到需要显示进度条或者倒计时的功能,我们今天就来实现一下。一、效果展示实现效果要求:1.环形倒计时2.能够根据总时间和当前时间进行比例性的倒计时3.进度条环形能够有颜色渐变效果4.中间... 查看详情
delphi:圆形进度(环形进度)(代码片段)
起源:重回DC5项目,资源下载美工提供圆形进度条,复习Delphi,为实现其颇觉有趣,遂研究其。最终效果图如下: 实现:制作TCircleProgress控件,实现方法参照系统之TGauge控件,CSDN上tp机器猫一个源码,结合GDI+绘制技术实现... 查看详情
纯css3实现圆形进度条动画
悄悄地,GIF格式的进度条已经越来越少,CSS进度条如雨后春笋般涌现。今天要介绍的这个CSS3进度条,效果和FlymeOS4上的加载动画一样。首先,来看下最终的效果: 查看详情