Android view自定义实现动态进度条

Android  自定义view实现动态进度条

效果图:

这个是看了梁肖的demo,根据他的思路自己写了一个,但是我写的这个貌似计算还是有些问题,从上面的图就可以看出来,左侧、顶部、右侧的线会有被截掉的部分,有懂得希望能给说一下,改进一下,这个过程还是有点曲折的,不过还是觉得收获挺多的。比如通动画来进行动态的展示(之前做的都是通过Handler进行更新的所以现在换一种思路觉得特别好),还有圆弧的起止角度,矩形区域的计算等!关于绘制我们可以循序渐进,比如最开始先画圆,然后再画周围的线,最后设置动画部分就可以了。不多说了,上代码了。

代码

自定义View

public class ColorProgressBar extends View{ //下面这两行在本demo中没什么用,只是前几天看别人的代码时学到的按一定尺寸,设置其他尺寸的方式,自动忽略或者学习一下也不错 // private int defaultStepIndicatorNum= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,40,getResources().getDisplayMetrics()); // int mCircleRadius=0.28f*defaultStepIndicatorNum; //布局的宽高 private int mWidth; private int mHeight; //直径 private int mDiameter=500; //底层圆画笔 private Paint mPaintbg; //顶层圆的画笔 private Paint mPaintft; //周围线的画笔 private Paint mPaintLine; //外层线条的长度 private int mLongItem=dip2px(20); //线条与圆的间距 private int mDistanceItem=dip2px(10); //进度条的最大宽度(取底层进度条与顶层进度条宽度最大的) private int mProgressWidth; //底层圆的颜色 private int mBackColor; //顶层圆的颜色 private int mFrontColor; //底层圆、顶层圆的宽度 private float mBackWidth; private float mFrontWidth; //设置进度 private float currentvalue; //通过动画演示进度 private ValueAnimator animator; private int curvalue; public ColorProgressBar(Context context) { this(context,null,0); } public ColorProgressBar(Context context, AttributeSet attrs) { this(context, attrs,0); } public ColorProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta=context.obtainStyledAttributes(attrs, R.styleable.ColorProgressBar); mBackColor= ta.getColor(R.styleable.ColorProgressBar_back_color, Color.BLACK); mFrontColor=ta.getColor(R.styleable.ColorProgressBar_front_color,mBackColor); mBackWidth=ta.getDimension(R.styleable.ColorProgressBar_back_width,dip2px(10)); mFrontWidth=ta.getDimension(R.styleable.ColorProgressBar_front_width,dip2px(10)); mProgressWidth=mBackWidth>mFrontWidth?(int)mBackWidth:(int)mFrontWidth; //注意释放资源 ta.recycle(); init(); } /** * 都是画笔初始化 */ private void init() { mPaintbg=new Paint(Paint.ANTI_ALIAS_FLAG); mPaintbg.setStrokeWidth(mProgressWidth); mPaintbg.setColor(mBackColor); mPaintbg.setStrokeCap(Paint.Cap.ROUND); mPaintbg.setStyle(Paint.Style.STROKE); mPaintft=new Paint(Paint.ANTI_ALIAS_FLAG); mPaintft.setColor(mFrontColor); mPaintft.setStyle(Paint.Style.STROKE); mPaintft.setStrokeWidth(mFrontWidth); mPaintft.setStrokeCap(Paint.Cap.ROUND); mPaintLine=new Paint(Paint.ANTI_ALIAS_FLAG); mPaintLine.setColor(Color.BLACK); mPaintLine.setStrokeWidth(5); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 宽度=高度=(长指针+指针与圆盘的间距+进度条的粗细+半径)*2 Log.e("测量数据","LongItem:"+mLongItem+"mDistanceItem:"+mDistanceItem+"mProgressWidth:"+mProgressWidth+"mDiameter:"+mDiameter/2); mWidth=(int)2*(mLongItem+mDistanceItem+mProgressWidth*2+mDiameter/2); mHeight=(int)2*(mLongItem+mDistanceItem+mProgressWidth*2+mDiameter/2); Log.e("自定义View","高度"+mHeight+"宽度"+mWidth); setMeasuredDimension(mWidth,mHeight); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //绘制底层圆弧,矩形的具体计算见图片 canvas.drawArc(new RectF(mProgressWidth/2+mDistanceItem+mLongItem,mProgressWidth/2+mDistanceItem+mLongItem,mWidth-mProgressWidth/2-mDistanceItem-mLongItem,mHeight-mProgressWidth/2-mDistanceItem-mLongItem),0,360,true,mPaintbg); // SweepGradient gradient=new SweepGradient(); //绘制边缘线 canvas.save(); canvas.rotate(144,mWidth/2,mHeight/2); for(int i=0;i<=30;i++){ canvas.rotate(-9,mWidth/2,mHeight/2); if(i%5==0){ canvas.drawLine(mWidth/2,5,mWidth/2,mLongItem,mPaintbg); }else { canvas.drawLine(mWidth/2,25,mWidth/2,mLongItem,mPaintLine); } } canvas.restore(); //给画笔设置渐变 SweepGradient sweepGradient=new SweepGradient(mWidth/2,mHeight/2,Color.RED,Color.YELLOW); mPaintft.setShader(sweepGradient); //绘制顶层圆弧,currentvalue在改变时呈现动态效果 canvas.drawArc(new RectF(mProgressWidth/2+mDistanceItem+mLongItem,mProgressWidth/2+mDistanceItem+mLongItem,mWidth-mProgressWidth/2-mDistanceItem-mLongItem,mHeight-mProgressWidth/2-mDistanceItem-mLongItem),135,currentvalue,false,mPaintft); mPaintft.setTextSize(100); mPaintft.setTextAlign(Paint.Align.CENTER); //绘制文本 canvas.drawText(String.format("%.0f",currentvalue),mWidth/2,mHeight/2+50,mPaintft); invalidate(); } /** * 设置动画 * @param value */ public void setCurrentValue(float value){ // currentvalue=value; animator=ValueAnimator.ofFloat(currentvalue,value); animator.setDuration(3000); animator.setTarget(currentvalue); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { currentvalue= (float) valueAnimator.getAnimatedValue(); curvalue=curvalue/10; } }); animator.start(); } private int dip2px(float dip){ float density=getContext().getResources().getDisplayMetrics().density; return (int)(dip*density+0.5f); } }

矩形计算

Activity调用

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.colorprogressbar); mBtStart1= (Button) findViewById(R.id.bt1); bar1= (ColorProgressBar) findViewById(R.id.cp1); mBtStart1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { bar1.setCurrentValue(270); } }); }

自定义属性

<declare-styleable name="ColorProgressBar"> <attr name="back_color" format="color"></attr> <attr name="front_color" format="color"></attr> <attr name="back_width" format="dimension"></attr> <attr name="front_width" format="dimension"></attr> </declare-styleable>

布局

注意:为了使用自定义属性需要添加一行代码(AS)

xmlns:app=http://schemas.android.com/apk/res-auto

布局

<LinearLayout 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="wrap_content" android:orientation="vertical"> <Button android:id="@+id/bt1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="start1"/> <com.demo.demo.networkdemo.colorprogressbar.widget.ColorProgressBar android:id="@+id/cp1" android:layout_width="232dp" android:layout_height="match_parent" android:layout_gravity="center_horizontal" app:back_color="@color/colorPrimary" app:front_color="@color/colorAccent" android:background="@mipmap/ic_launcher"/> </LinearLayout>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-10-12 10:10:03

Android view自定义实现动态进度条的相关文章

Android view自定义实现动态进度条_Android

Android  自定义view实现动态进度条 效果图: 这个是看了梁肖的demo,根据他的思路自己写了一个,但是我写的这个貌似计算还是有些问题,从上面的图就可以看出来,左侧.顶部.右侧的线会有被截掉的部分,有懂得希望能给说一下,改进一下,这个过程还是有点曲折的,不过还是觉得收获挺多的.比如通动画来进行动态的展示(之前做的都是通过Handler进行更新的所以现在换一种思路觉得特别好),还有圆弧的起止角度,矩形区域的计算等!关于绘制我们可以循序渐进,比如最开始先画圆,然后再画周围的线,最后设置动画

Android零基础入门第52节:自定义酷炫进度条

原文:Android零基础入门第52节:自定义酷炫进度条    Android系统默认的ProgressBar往往都不能满足实际开发需要,一般都会开发者自定义ProgressBar.     在Android开发中,自定义ProgressBar一般有三种思路来完成.     一.在系统进度条基础上优化       首先来看一下style="@android:style/Widget.ProgressBar.Horizontal"的源码.鼠标移动到style属性值上,按住Ctrl键,鼠标

Android自定义圆形倒计时进度条_Android

效果预览 源代码传送门:https://github.com/yanzhenjie/CircleTextProgressbar 实现与原理 这个文字圆形的进度条我们在很多APP中看到过,比如APP欢迎页倒计时,下载文件倒计时等. 分析下原理,可能有的同学一看到这个自定义View就慌了,这个是不是要继承View啊,是不是要绘制啊之类的,答案是:是的.但是我们也不要担心,实现这个效果实在是so easy.下面就跟我一起来看看核心分析和代码吧. 原理分析 首先我们观察上图,需要几个部分组成: 1. 外

Android自定义多节点进度条显示的实现代码(附源码)

亲们里面的线段颜色和节点图标都是可以自定义的. 在没给大家分享实例代码之前,先给大家展示下效果图: main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rl_parent" xmlns:tools="http://schemas.android.com/tools" android:layou

Android使用Canvas绘制圆形进度条效果_Android

前言 Android自定义控件经常会用到Canvas绘制2D图形,在优化自己自定义控件技能之前,必须熟练掌握Canvas绘图机制.本文从以下三个方面对Canvas绘图机制进行讲解: 画布Canvas 画笔Paint 示例圆形进度条 画布Canvas 首先,来看一下Android官网对Canvas类的定义: The Canvas class holds the "draw" calls.To draw something, you need 4 basic components: A B

Android使用Canvas绘制圆形进度条效果

前言 Android自定义控件经常会用到Canvas绘制2D图形,在优化自己自定义控件技能之前,必须熟练掌握Canvas绘图机制.本文从以下三个方面对Canvas绘图机制进行讲解: 画布Canvas 画笔Paint 示例圆形进度条 画布Canvas 首先,来看一下Android官网对Canvas类的定义: The Canvas class holds the "draw" calls.To draw something, you need 4 basic components: A B

【Android开发】高级组件-进度条

当一个应用在后台执行时,前台界面不会有任何信息,这是用户根本不知道程序是否在执行以及执行进度等,因此需要使用进度条来提示程序执行的进度.在Android中,进度条(ProgressBar)用于向用户显示某个耗时操作完成的百分比. 在屏幕中添加进度天,可以在XML布局文件中通过<ProgressBar>标记添加,基本语法格式如下: <ProgressBar     属性列表  > </ProgressBar> ProgressBar组件支持的XML属性如下所示: andr

android用的handler更新进度条但是显示不出来并且进度条的高不能改总是那么高

问题描述 android用的handler更新进度条但是显示不出来并且进度条的高不能改总是那么高 xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layo

Android编程开发实现带进度条和百分比的多线程下载

本文实例讲述了Android编程开发实现带进度条和百分比的多线程下载.分享给大家供大家参考,具体如下: 继上一篇<java多线程下载实例详解>之后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java: package com.example.downloads; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.H