文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么在Android中自定义一个圆形进度条效果

2023-06-14 14:09

关注

怎么在Android中自定义一个圆形进度条效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

1 控件 RoundProgress

package listview.tianhetbm.p2p.ui;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import android.util.Log;import android.view.View;import listview.tianhetbm.p2p.R;public class RoundProgress extends View {    private Paint paint = new Paint();    private int roundColor;    private int roundProgressColor;    private int textColor;    private float textSize;    private float roundWidth;    private int max = 100;    private int progress = 50;    public RoundProgress(Context context) {        this(context, null);    }    public RoundProgress(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public RoundProgress(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RoundProgress);        //圆环的颜色        roundColor = ta.getColor(R.styleable.RoundProgress_roundColor, Color.RED);        //圆环进度的颜色        roundProgressColor = ta.getColor(R.styleable.RoundProgress_roundProgressColor, Color.GREEN);        //中间进度百分比文字字符串的颜色        textColor = ta.getColor(R.styleable.RoundProgress_textColor, Color.GREEN);        //中间进度百分比的字符串的字体大小        textSize = ta.getDimension(R.styleable.RoundProgress_textSize, 15);        //圆环的宽度        roundWidth = ta.getDimension(R.styleable.RoundProgress_roundWidth, 5);        ta.recycle();    }    @Override    protected void onDraw(Canvas canvas) {//第一步:绘制一个最外层的圆        paint.setColor(roundColor);        paint.setStrokeWidth(roundWidth);        paint.setStyle(Paint.Style.STROKE);        paint.setAntiAlias(true);        int center = getWidth() / 2;        int radius = (int) (center - roundWidth / 2-45);        //canvas.drawCircle(center, center, radius, paint);        RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius);        canvas.drawArc(oval, 135, 270, false, paint);        //第二步:绘制正中间的文本        float textWidth = paint.measureText(progress + "%");        paint.setColor(textColor);        paint.setTextSize(textSize);        paint.setStrokeWidth(0);        canvas.drawText(progress + "%", center - textWidth / 2, center + textSize / 2, paint);        //第三步:                //RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius);        paint.setColor(roundProgressColor);        paint.setStrokeWidth(roundWidth);        paint.setStyle(Paint.Style.STROKE);        canvas.drawArc(oval, 135, 270 * progress / max, false, paint);        Log.e("测试角度",(270 * progress / max)+"");        Paint mp=new Paint();        mp.setAntiAlias(true);        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.tiger);        int bitmapHeight = bitmap.getHeight()/2;        int bitmapWidth = bitmap.getWidth()/2;        //canvas.translate(-center, center);        float y=0f,x=0f;//        if(270 * progress / max<=45){            y = (float) (center-bitmapWidth - (radius) * Math.cos((270 * progress / max+225)*Math.PI/180));            x = (float) (center-bitmapWidth + (radius) * Math.sin((270 * progress / max+225)*Math.PI/180));//        }    //canvas.translate(center, center*2);    Log.e("测试角度", y + "-----" + x);    canvas.drawBitmap(bitmap, x, y, mp);    }    public void setProgress(int progress){        this.progress = progress;        if(progress>100){            this.progress = 100;        }        postInvalidate();    }}

2 xml 布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center_horizontal">    <listview.tianhetbm.p2p.ui.RoundProgress        android:layout_marginTop="30dp"        android:layout_width="250dp"        android:layout_height="250dp"        android:layout_marginLeft="10dp"        app:roundColor="@color/back_blue"        app:roundProgressColor="@color/back_orange"        android:id="@+id/ce"        app:roundWidth="10dp"        app:textSize="18sp"        app:textColor="@color/record_red"        /></RelativeLayout>

3 activity(主要代码)

 super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main_three);        ButterKnife.bind(this);        new Thread(){           @Override           public void run() {               while (progress<80){                   progress+=1;                   ce.setProgress(progress);                   try {                       Thread.sleep(50);                   } catch (Exception e) {                       e.printStackTrace();                   }               }           }}.start();

看完上述内容,你们掌握怎么在Android中自定义一个圆形进度条效果的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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