Android进度条学习

自定义属性

    <!--
    roundColor 圆环的颜色

    roundProgressColor 进度的颜色

    roundWidth 圆环的宽度

    textColor 文字颜色

    textSize  文字大小

    max 最大值

    textIsDisplayable  是否显示进度文本

    style 样式
    STROKE 空心
    FILL 实心
    -->

    <declare-styleable name="RoundProgressBar">
        <attr name="roundColor" format="color"/>
        <attr name="roundProgressColor" format="color"/>
        <attr name="roundWidth" format="dimension"></attr>
        <attr name="textColor" format="color" />
        <attr name="textSize" format="dimension" />
        <attr name="max" format="integer"></attr>
        <attr name="textIsDisplayable" format="boolean"></attr>
        <attr name="style">
            <enum name="STROKE" value="0"></enum>
            <enum name="FILL" value="1"></enum>
        </attr>
    </declare-styleable>
public RoundProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mPaint = new Paint();

        /**
         * 获取自定义的属性
         */
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgressBar);

        //底色
        mRoundColor = typedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED);
        //进度的颜色
        mRoundProgressColor = typedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.BLUE);
        //圆形的宽
        mRoundWidth = typedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 20);

        //字体颜色 中间
        mTextColor = typedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.BLUE);

        //中间进度显示的字体大小
        mTextSize = typedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);

        //最大值
        mMax = typedArray.getInteger(R.styleable.RoundProgressBar_max, 100);

        //文字是否显示
        mTextIsDisplayable = typedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);

        //实心或者 空心
        mStyle = typedArray.getInt(R.styleable.RoundProgressBar_style, 0);

        typedArray.recycle();

    }

绘制

        //圆心
        int centerOfCircle = getWidth() / 2;
        //radius 半径
        int radius = (int) (centerOfCircle - mRoundWidth / 2);

        //设置画笔
        mPaint.setAntiAlias(true);
        //圆环的颜色
        mPaint.setColor(mRoundColor);

        //设置空心
        mPaint.setStyle(Paint.Style.STROKE);

        //画笔宽度
        mPaint.setStrokeWidth(mRoundWidth);

        //画圆
        canvas.drawCircle(centerOfCircle, centerOfCircle, radius, mPaint);

        /**
         * 画百分比
         */
        mPaint.setStrokeWidth(0);
        //字体大小
        mPaint.setTextSize(mTextSize);
        //画笔颜色
        mPaint.setColor(mTextColor);
        //字体
        mPaint.setTypeface(Typeface.DEFAULT_BOLD);

        //计算百分比
        int percent = (int) (((float) mProgress / (float) mMax) * 100);

        //测量字体的宽度
        float textWidth = mPaint.measureText(percent + "%");
        //判断是否显示进度文字 不是0,风格是空心的
        if (mTextIsDisplayable && percent != 0 && mStyle == STROKE) {

            canvas.drawText(percent + "%", centerOfCircle - textWidth / 2, centerOfCircle + textWidth / 2, mPaint);
        }

        /**
         * 设置进度
         */
        mPaint.setColor(mRoundProgressColor);
        //画笔宽度
        mPaint.setStrokeWidth(mRoundWidth);
        mPaint.setAntiAlias(true);

        RectF oval = new RectF(centerOfCircle - radius, centerOfCircle - radius, centerOfCircle + radius, centerOfCircle + radius);

        switch (mStyle) {

            case STROKE:
                //空心
                mPaint.setStyle(Paint.Style.STROKE);
                //画圆弧

                /**
                 *
                 *开始的角度
                 */
                canvas.drawArc(oval, 180, 360 * mProgress / mMax, false, mPaint);
                break;
            case FILL:
                //实心
                mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
                //画圆弧
                if(mProgress!=0) {
                    canvas.drawArc(oval, 180, 360 * mProgress / mMax, true, mPaint);
                }
                break;
        }

源码:

https://github.com/ln0491/ProgressDemo

时间: 2024-12-28 18:54:37

Android进度条学习的相关文章

Android进度条学习一

DoLengthyWork.java package tw.android; import java.util.Calendar; import android.os.Handler; import android.widget.ProgressBar; public class DoLengthyWork extends Thread { private Handler mHandler;//对象mHandler用来运行post更新ProgressBar的工作 private Progress

android 进度条

在之前实现自定义进度条的时候,基本上都是使用ImageView来实现的,见  Android 用Animation-list实现逐帧动画,最近一段时间看到APP的进度条很多都是ProgressBar然后圆圈里面是一张图片,所以就查看了一下ProgressBar的使用. 1.动画实现 定义res/anim/loading.xml,例如: <?xml version="1.0" encoding="UTF-8"?> <animation-list

【Android进度条】三种方式实现自定义圆形进度条ProgressBar

一.通过动画实现 定义res/anim/loading.xml如下: [html] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <animation-list android:oneshot="false" xmlns:android="http://schemas.android.com/apk/res/android"> &

iOS之UI--彩虹动画进度条学习和自主封装改进

前言: 首先展示一下这个iOS小示例的彩色进度条动画效果: 阅读本文先说说好处:对于基础不好的读者,可以直接阅读文末尾的"如何使用彩虹动画进度条"章节,然后将我封装好的这个功能模块类用到你的工程项目中即可. 这个效果的示例是老外Nick Jensen在2013年写的一个作品:使用CAGradientLayer的动画精度条View. 本人阅读了老外的源码之后,觉得老外这个进度条的效果很不错,但是觉得他写的代码有待改进. 小贴士:读者可以直接将老外的源码下载下来,跑一下,然后对比本人写的博

Android——进度条ProgressBar

1.activity_progressbar.xml <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="

Android进度条(星级评分)使用详解(二)

一.SeekBar拖动条使用 SeekBar继承于ProgressBar,ProgressBar所支持的XML属性和方法完全适用于SeekBar.拖动条和进度条的区别是:进度条采用颜色填充来表明进度完成的程度,而拖动条则通过滑块位置来标识数值并且运行用户拖动滑块来改变值.因此,拖动条通常用于对系统的某种数值进行调节,比如调节音量.图片的透明度等. 1.拖动条效果 2.代码实现 功能:通过拖动滑块该动态改变图片的透明度 public class MainActivity extends Actio

android 进度条ProgressBar样式设置

普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中.一般只要在XML布局中定义就可以了. <progressBar Android:id="@+id/widget43" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="

&lt;Android&gt;进度条

Android中的进度条有多种:对话框进度条,标题栏进度条和水平进度条 1.对话框进度条 a)         覆盖Activity的onCreateDialog()方法,并在其中创建对话框. b)        调用Activity的showDialog()方法,显示进度条对话框. public class MainActivity extends Activity { private Button myBtn; @Override public void onCreate(Bundle sa

Android 进度条改变图片透明度

1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent