javaswing圆形加载进度条(代码片段)

author author     2022-12-22     447

关键词:

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上的加载动画一样。首先,来看下最终的效果:  查看详情