文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android中怎么自定义view实现圆环进度条效果

2023-06-29 05:34

关注

这篇文章主要讲解了“Android中怎么自定义view实现圆环进度条效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android中怎么自定义view实现圆环进度条效果”吧!

核心代码

自定义view的属性

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="RingProgressBar">        <attr name="ringColor" format="color" />        <attr name="ringProgressColor" format="color" />        <attr name="ringWidth" 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></resources>

自定义view

package com.czhappy.ringprogressdemo.view;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Typeface;import android.util.AttributeSet;import android.util.Log;import android.view.View;import com.czhappy.ringprogressdemo.R;public class RingProgressBar extends View {        private Paint ringPaint;    private Paint ringProgressPaint;    private Paint txtPaint;        private int ringColor;        private int ringProgressColor;        private int textColor;        private float textSize;        private float ringWidth;        private int max;        private int progress;        private boolean textIsDisplayable;    private Context mContext;        private int style;    public static final int STROKE = 0;    public static final int FILL = 1;    public RingProgressBar(Context context) {        this(context, null);    }    public RingProgressBar(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public RingProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        this.mContext = context;        // 获取自定义的属性        initAttrs(context, attrs);        initPaint();    }    private void initAttrs(Context context, AttributeSet attrs) {        TypedArray mTypedArray = context.obtainStyledAttributes(attrs,                R.styleable.RingProgressBar);        //获取自定义属性和默认值        ringColor = mTypedArray.getColor(R.styleable.RingProgressBar_ringColor, Color.GRAY);        ringProgressColor = mTypedArray.getColor(R.styleable.RingProgressBar_ringProgressColor, Color.GREEN);        textColor = mTypedArray.getColor(R.styleable.RingProgressBar_textColor, Color.GREEN);        textSize = mTypedArray.getDimension(R.styleable.RingProgressBar_textSize, 16);        ringWidth = mTypedArray.getDimension(R.styleable.RingProgressBar_ringWidth, 5);        max = mTypedArray.getInteger(R.styleable.RingProgressBar_max, 100);        textIsDisplayable = mTypedArray.getBoolean(R.styleable.RingProgressBar_textIsDisplayable, true);        style = mTypedArray.getInt(R.styleable.RingProgressBar_style, 0);        //资源回收        mTypedArray.recycle();    }        private void initPaint() {        //圆环画笔        ringPaint = new Paint();        ringPaint.setColor(ringColor); //设置圆环的颜色        ringPaint.setStyle(Paint.Style.STROKE); //设置空心        ringPaint.setStrokeWidth(ringWidth); //设置圆环的宽度        ringPaint.setAntiAlias(true);  //消除锯齿        //圆环进度画笔        ringProgressPaint = new Paint();        ringProgressPaint.setColor(ringProgressColor); //设置圆环的颜色        ringProgressPaint.setStrokeWidth(ringWidth); //设置圆环的宽度        ringProgressPaint.setAntiAlias(true);  //消除锯齿        switch (style) {            case STROKE:                ringProgressPaint.setStyle(Paint.Style.STROKE);                break;            case FILL:                ringProgressPaint.setStyle(Paint.Style.FILL_AND_STROKE);                break;        }        //百分比文字画笔        txtPaint = new Paint();        txtPaint.setColor(textColor);        txtPaint.setTextSize(textSize);        txtPaint.setTypeface(Typeface.DEFAULT_BOLD); //设置字体    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //圆心坐标        int mXCenter = getWidth() / 2;        int mYCenter = getHeight() / 2;        int radius = (int) (mXCenter - ringWidth / 2); //圆环的半径        //绘制圆环        canvas.drawCircle(mXCenter, mYCenter, radius, ringPaint);        //绘制圆环进度        RectF oval = new RectF(mXCenter - radius, mYCenter - radius, mXCenter                + radius, mYCenter + radius);  //用于定义的圆弧的形状和大小的界限        switch (style) {            case STROKE:                canvas.drawArc(oval, -90, 360 * progress / max, false, ringProgressPaint);  //根据进度画圆弧                break;            case FILL:                if (progress != 0)                    canvas.drawArc(oval, -90, 360 * progress / max, true, ringProgressPaint);  //根据进度画圆弧                break;        }        //绘制百分比数字        //文字绘制        String txt = progress  + "%";        //文字的长度        float mTxtWidth = txtPaint.measureText(txt, 0, txt.length());        Log.e("tag", textIsDisplayable+","+progress+(style==STROKE));        if(textIsDisplayable && progress!=0 && style==STROKE){            canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter+textSize/2, txtPaint);        }    }    public synchronized int getMax() {        return max;    }        public synchronized void setMax(int max) {        if(max < 0){            throw new IllegalArgumentException("max not less than 0");        }        this.max = max;    }        public synchronized int getProgress() {        return progress;    }        public synchronized void setProgress(int progress) {        if(progress < 0){            throw new IllegalArgumentException("progress not less than 0");        }        if(progress > max){            progress = max;        }        if(progress <= max){            this.progress = progress;            postInvalidate();        }    }    public int getRingColor() {        return ringColor;    }    public void setRingColor(int ringColor) {        this.ringColor = ringColor;    }    public int getRingProgressColor() {        return ringProgressColor;    }    public void setRingProgressColor(int ringProgressColor) {        this.ringProgressColor = ringProgressColor;    }    public int getTextColor() {        return textColor;    }    public void setTextColor(int textColor) {        this.textColor = textColor;    }    public float getTextSize() {        return textSize;    }    public void setTextSize(float textSize) {        this.textSize = textSize;    }    public float getRingWidth() {        return ringWidth;    }    public void setRingWidth(float roundWidth) {        this.ringWidth = roundWidth;    }}

MainActivity.java

package com.czhappy.ringprogressdemo.activity;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import com.czhappy.ringprogressdemo.R;import com.czhappy.ringprogressdemo.view.RingProgressBar;public class MainActivity extends AppCompatActivity {    private RingProgressBar myProgress;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        myProgress = (RingProgressBar) findViewById(R.id.myProgress);    }    public void beginAnim(View view){        new Thread(){            @Override            public void run() {                super.run();                for(int i=0; i<=60; i++){                    try {                        Thread.sleep(20);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    myProgress.setProgress(i);                }            }        }.start();    }}

布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:ring="http://schemas.android.com/apk/res-auto"    android:id="@+id/activity_main"    android:gravity="center_horizontal"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <Button        android:layout_width="match_parent"        android:onClick="beginAnim"        android:layout_height="wrap_content"        android:text="开始动画"/>    <com.czhappy.ringprogressdemo.view.RingProgressBar        android:id="@+id/myProgress"        android:layout_width="100dp"        android:layout_height="100dp"        android:layout_marginTop="20dp"        ring:ringColor="@color/ring_color"        ring:ringProgressColor="@color/ring_progress_color"        ring:textColor="@color/ring_progress_color"        ring:textIsDisplayable="true"        ring:ringWidth="6dp"        ring:textSize="16sp"/></LinearLayout>

感谢各位的阅读,以上就是“Android中怎么自定义view实现圆环进度条效果”的内容了,经过本文的学习后,相信大家对Android中怎么自定义view实现圆环进度条效果这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯