iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android怎么自定义View实现圆弧进度效果
  • 246
分享到

Android怎么自定义View实现圆弧进度效果

2023-07-06 03:07:48 246人浏览 八月长安
摘要

这篇文章主要介绍“Android怎么自定义View实现圆弧进度效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义View实现圆弧进度效果”文章能帮助大家解决问题。技术实现Ar

这篇文章主要介绍“Android怎么自定义View实现圆弧进度效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义View实现圆弧进度效果”文章能帮助大家解决问题。

技术实现

ArcView继承自View

canvas(画布)

Paint(画笔)

效果图:类似于QQ的计步效果

Android怎么自定义View实现圆弧进度效果

1.继承自View

重写3个构造方法(新的api中的构造方法是4个)

public ArcView(Context context) { this(context,null); }public ArcView(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public ArcView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //init(); }

重写View的OnDraw方法

@SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);  centerX=getWidth()/2;  centerY=getHeight()/2; //初始化paint initPaint(); //绘制弧度 drawArc(canvas); //绘制文本 drawText(canvas); }注:这里的paint初始化我放在了onDraw方法中进行的,当然你也可以放在有三个参数的构造方法中初始化。

2.Paint初始化

圆弧的画笔mArcPaint

//圆弧的paint mArcPaint=new Paint(Paint.ANTI_ALIAS_FLAG); //抗锯齿 mArcPaint.setAntiAlias(true); mArcPaint.setColor(Color.parseColor("#666666")); //设置透明度(数值为0-255) mArcPaint.setAlpha(100); //设置画笔的画出的形状 mArcPaint.setStrokeJoin(Paint.Join.ROUND); mArcPaint.setStrokeCap(Paint.Cap.ROUND); //设置画笔类型 mArcPaint.setStyle(Paint.Style.STROKE); mArcPaint.setStrokeWidth(dp2px(mStrokeWith));

文字的画笔mTextPaint

//中心文字的paintmTextPaint=new Paint();mTextPaint.setAntiAlias(true);mTextPaint.setColor(Color.parseColor("#FF4A40"));//设置文本的对齐方式mTextPaint.setTextAlign(Paint.Align.CENTER);//mTextPaint.setTextSize(getResources().getDimensionPixelSize(R.dimen.dp_12));mTextPaint.setTextSize(dp2px(25));

3.Canvas绘制

圆弧的绘制

 private void drawArc(Canvas canvas) { //绘制圆弧背景  RectF mRectF=new RectF(mStrokeWith+dp2px(5),mStrokeWith+dp2px(5),getWidth()-mStrokeWith-dp2px(5),getHeight()-mStrokeWith);  canvas.drawArc(mRectF,startAngle,mAngle,false,mArcPaint); //绘制当前数值对应的圆弧  mArcPaint.setColor(Color.parseColor("#FF4A40")); //根据当前数据绘制对应的圆弧  canvas.drawArc(mRectF,startAngle,mIncludedAngle,false,mArcPaint); }

文本的绘制

 private void drawText(Canvas canvas) {  Rect mRect=new Rect();  String mValue=String.valueOf(mAnimatorValue); //绘制中心的数值  mTextPaint.getTextBounds(mValue,0,mValue.length(),mRect);  canvas.drawText(String.valueOf(mAnimatorValue),centerX,centerY+mRect.height(),mTextPaint); //绘制中心文字描述  mTextPaint.setColor(Color.parseColor("#999999"));  mTextPaint.setTextSize(dp2px(12));  mTextPaint.getTextBounds(mDes,0,mDes.length(),mRect);  canvas.drawText(mDes,centerX,centerY+2*mRect.height()+dp2px(10),mTextPaint); //绘制最小值  String minValue=String.valueOf(mMinValue);  String maxValue=String.valueOf(mMaxValue);  mTextPaint.setTextSize(dp2px(18));  mTextPaint.getTextBounds(minValue,0,minValue.length(),mRect);  canvas.drawText(minValue, (float) (centerX-0.6*centerX-dp2px(5)), (float) (centerY+0.75*centerY+mRect.height()+dp2px(5)),mTextPaint); //绘制最大值  mTextPaint.getTextBounds(maxValue,0,maxValue.length(),mRect);  canvas.drawText(maxValue, (float) (centerX+0.6*centerX+dp2px(5)), (float) (centerY+0.75*centerY+mRect.height()+dp2px(5)),mTextPaint); }

4.添加动画效果及数据

动画效果

 private void setAnimation(float startAngle, float currentAngle,int currentValue, int time) { //绘制当前数据对应的圆弧的动画效果  ValueAnimator progressAnimator = ValueAnimator.ofFloat(startAngle, currentAngle);  progressAnimator.setDuration(time);  progressAnimator.setTarget(mIncludedAngle);  progressAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {   @Override   public void onAnimationUpdate(ValueAnimator animation) {    mIncludedAngle = (float) animation.getAnimatedValue(); //重新绘制,不然不会出现效果 postInvalidate(); } }); //开始执行动画  progressAnimator.start(); //中心数据的动画效果  ValueAnimator valueAnimator = ValueAnimator.ofInt(mAnimatorValue, currentValue);  valueAnimator.setDuration(2500);  valueAnimator.setInterpolator(new LinearInterpolator());  valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {    @Override   public void onAnimationUpdate(ValueAnimator valueAnimator) {     mAnimatorValue = (int) valueAnimator.getAnimatedValue(); postInvalidate(); } });  valueAnimator.start(); }

数据添加

 public void setValues(int minValue,int maxValue, int currentValue,String des) {  mDes=des;  mMaxValue=maxValue;  mMinValue=minValue; //完全覆盖背景弧度 if (currentValue   maxValue) {   currentValue = maxValue; } //计算弧度比重  float scale = (float) currentValue / maxValue; //计算弧度  float currentAngle = scale * mAngle; //开始执行动画 setAnimation(0, currentAngle, currentValue,2500);

完整代码:

public class ArcView extends View {//根据数据显示的圆弧Paintprivate Paint mArcPaint;//文字描述的paintprivate Paint mTextPaint;//圆弧开始的角度private float startAngle=135;//圆弧结束的角度private float endAngle=45;//圆弧背景的开始和结束间的夹角大小private float mAngle=270;//当前进度夹角大小private float mIncludedAngle=0;//圆弧的画笔的宽度private float mStrokeWith=10;//中心的文字描述private String mDes="";//动画效果的数据及最大/小值private int mAnimatorValue,mMinValue,mMaxValue;//中心点的XY坐标private float centerX,centerY;public ArcView(Context context) {this(context,null);}public ArcView(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}public ArcView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);//init();}private void initPaint() {//圆弧的paintmArcPaint=new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿mArcPaint.setAntiAlias(true);mArcPaint.setColor(Color.parseColor("#666666"));//设置透明度(数值为0-255)mArcPaint.setAlpha(100);//设置画笔的画出的形状mArcPaint.setStrokeJoin(Paint.Join.ROUND);mArcPaint.setStrokeCap(Paint.Cap.ROUND);//设置画笔类型mArcPaint.setStyle(Paint.Style.STROKE);mArcPaint.setStrokeWidth(dp2px(mStrokeWith));//中心文字的paintmTextPaint=new Paint();mTextPaint.setAntiAlias(true);mTextPaint.setColor(Color.parseColor("#FF4A40"));//设置文本的对齐方式mTextPaint.setTextAlign(Paint.Align.CENTER);//mTextPaint.setTextSize(getResources().getDimensionPixelSize(R.dimen.dp_12));mTextPaint.setTextSize(dp2px(25));}@SuppressLint("DrawAllocation")@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);centerX=getWidth()/2;centerY=getHeight()/2;//初始化paintinitPaint();//绘制弧度drawArc(canvas);//绘制文本drawText(canvas);}private void drawText(Canvas canvas) {Rect mRect=new Rect();String mValue=String.valueOf(mAnimatorValue);//绘制中心的数值mTextPaint.getTextBounds(mValue,0,mValue.length(),mRect);canvas.drawText(String.valueOf(mAnimatorValue),centerX,centerY+mRect.height(),mTextPaint);//绘制中心文字描述mTextPaint.setColor(Color.parseColor("#999999"));mTextPaint.setTextSize(dp2px(12));mTextPaint.getTextBounds(mDes,0,mDes.length(),mRect);canvas.drawText(mDes,centerX,centerY+2*mRect.height()+dp2px(10),mTextPaint);//绘制最小值String minValue=String.valueOf(mMinValue);String maxValue=String.valueOf(mMaxValue);mTextPaint.setTextSize(dp2px(18));mTextPaint.getTextBounds(minValue,0,minValue.length(),mRect);canvas.drawText(minValue, (float) (centerX-0.6*centerX-dp2px(5)), (float) (centerY+0.75*centerY+mRect.height()+dp2px(5)),mTextPaint);//绘制最大指mTextPaint.getTextBounds(maxValue,0,maxValue.length(),mRect);canvas.drawText(maxValue, (float) (centerX+0.6*centerX+dp2px(5)), (float) (centerY+0.75*centerY+mRect.height()+dp2px(5)),mTextPaint);}private void drawArc(Canvas canvas) {//绘制圆弧背景RectF mRectF=new RectF(mStrokeWith+dp2px(5),mStrokeWith+dp2px(5),getWidth()-mStrokeWith-dp2px(5),getHeight()-mStrokeWith);canvas.drawArc(mRectF,startAngle,mAngle,false,mArcPaint);//绘制当前数值对应的圆弧mArcPaint.setColor(Color.parseColor("#FF4A40"));//根据当前数据绘制对应的圆弧canvas.drawArc(mRectF,startAngle,mIncludedAngle,false,mArcPaint);}private void setAnimation(float startAngle, float currentAngle,int currentValue, int time) {//绘制当前数据对应的圆弧的动画效果ValueAnimator progressAnimator = ValueAnimator.ofFloat(startAngle, currentAngle);progressAnimator.setDuration(time);progressAnimator.setTarget(mIncludedAngle);progressAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mIncludedAngle = (float) animation.getAnimatedValue();//重新绘制,不然不会出现效果postInvalidate();}});//开始执行动画progressAnimator.start();//中心数据的动画效果ValueAnimator valueAnimator = ValueAnimator.ofInt(mAnimatorValue, currentValue);valueAnimator.setDuration(2500);valueAnimator.setInterpolator(new LinearInterpolator());valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {mAnimatorValue = (int) valueAnimator.getAnimatedValue();postInvalidate();}});valueAnimator.start();}public void setValues(int minValue,int maxValue, int currentValue,String des) {mDes=des;mMaxValue=maxValue;mMinValue=minValue;//完全覆盖if (currentValue   maxValue) {currentValue = maxValue;}//计算弧度比重float scale = (float) currentValue / maxValue;//计算弧度float currentAngle = scale * mAngle;//开始执行动画setAnimation(0, currentAngle, currentValue,2500);}public float dp2px(float dp) {DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();return dp * metrics.density;}}

关于“Android怎么自定义View实现圆弧进度效果”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Android怎么自定义View实现圆弧进度效果

本文链接: https://www.lsjlt.com/news/357635.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android怎么自定义View实现圆弧进度效果
    这篇文章主要介绍“Android怎么自定义View实现圆弧进度效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义View实现圆弧进度效果”文章能帮助大家解决问题。技术实现Ar...
    99+
    2023-07-06
  • Android自定义View实现圆弧进度效果逐步完成过程
    目录技术实现1.继承自View2.Paint初始化3.Canvas绘制4.添加动画效果及数据涉及到的知识Canvas(画布),Paint(画笔),自定义控件等有三种:一个是直接从Vi...
    99+
    2023-05-16
    Android自定义View圆弧进度 Android实现圆弧进度 Android自定义View
  • Android自定义view实现圆环进度条效果
    本文实例为大家分享了Android自定义view实现圆环进度条效果的具体代码,供大家参考,具体内容如下 一、实现效果图 二、核心代码 自定义view的属性 <xml vers...
    99+
    2022-11-13
  • Android自定义view实现圆形进度条效果
    Android中实现进度条有很多种方式,自定义进度条一般是继承progressBar或继承view来实现,本篇中讲解的是第二种方式。 先上效果图: 实现圆形进度条总体来说并不难,还...
    99+
    2022-11-13
  • Android中怎么自定义view实现圆环进度条效果
    这篇文章主要讲解了“Android中怎么自定义view实现圆环进度条效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android中怎么自定义view实现圆环进度条效果”吧!核心代码自定义...
    99+
    2023-06-29
  • android自定义view制作圆形进度条效果
    还是我们自定View的那几个步骤: 1、自定义View的属性 2、在View的构造方法中获得我们自定义的属性 [ 3、重写onMesure ] 4、重写onDraw 1、自定...
    99+
    2022-06-06
    view 进度条 Android
  • Android自定义view实现半圆环效果
    本文实例为大家分享了Android自定义view实现半圆环的具体代码,供大家参考,具体内容如下 1.自定义属性 <declare-styleable name="Semicir...
    99+
    2022-11-13
  • Android怎么自定义View实现圆形进度条
    本文小编为大家详细介绍“Android怎么自定义View实现圆形进度条”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android怎么自定义View实现圆形进度条”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。原...
    99+
    2023-07-02
  • Android自定义View实现圆形进度条
    本文实例为大家分享了Android自定义View实现圆形进度条的具体代码,供大家参考,具体内容如下 原理非常简单,在自定义View的基础上使用Canvas的drawCircle画两个...
    99+
    2022-11-13
  • Android自定义View实现圆环交替效果
    下面请先看效果图:    看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制。 首先是我们的attrs文件: <?xml ver...
    99+
    2022-06-06
    view Android
  • Android如何实现自定义view画圆效果
    这篇文章主要介绍了Android如何实现自定义view画圆效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。看图代码:package sjx.com.custonv...
    99+
    2023-05-30
    android view
  • Android自定义View实现圆形加载进度条效果的方法
    这篇文章将为大家详细讲解有关Android自定义View实现圆形加载进度条效果的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。View仿华为圆形加载进度条效果图实现思路可以看出该View可分为三个部分...
    99+
    2023-05-30
    android view 进度条
  • Android自定义view实现进度条指示效果
    先看看效果图: 首先是布局文件 <FrameLayout android:layout_width="match_parent" android:layout_...
    99+
    2022-06-06
    view 进度条 Android
  • Android自定义圆形进度条效果
    本文实例为大家分享了Android自定义圆形进度条效果的具体代码,供大家参考,具体内容如下 1 控件 RoundProgress package listview.tianhet...
    99+
    2022-11-12
  • Android如何自定义view实现半圆环效果
    小编给大家分享一下Android如何自定义view实现半圆环效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下1.自定义属性<declare-s...
    99+
    2023-06-29
  • Android 自定View实现仿QQ运动步数圆弧及动画效果
    在之前的Android超精准计步器开发-Dylan计步中的首页用到了一个自定义控件,和QQ运动的界面有点类似,还有动画效果,下面就来讲一下这个View是如何绘制的。 1.先看效...
    99+
    2022-06-06
    view 动画 Android
  • Android自定义View实现圆形加载进度条
    本文实例为大家分享了Android自定义View实现圆形加载进度条的具体代码,供大家参考,具体内容如下 效果图 话不多说,咱们直接看代码 首先第一种: 1、创建自定义View类 p...
    99+
    2022-11-13
  • Android自定义View实现钟摆效果进度条PendulumView
    在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果。由于原生的进度条确实是不好看,所以想可以自定义View实现这样的效果,以后也可以用于加载页面的进度条。...
    99+
    2022-06-06
    view Android
  • Android自定义view实现水波纹进度球效果
    今天我们要实现的这个view没有太多交互性的view,所以就继承view。 自定义view的套路,套路很深       1、获...
    99+
    2022-06-06
    view Android
  • Android自定义View实现简单的圆形Progress效果
    先给大家展示下效果图,如果感觉不错,请参考实现思路: 我们要实现一个自定义的再一个圆形中绘制一个弧形的自定义View,思路是这样的:   先要创建一个类ProgressVie...
    99+
    2022-06-06
    view progress Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作