【Android自定义控件】圆圈交替,仿progress效果
来源:互联网 发布:淘宝运动衣 编辑:程序博客网 时间:2024/05/27 19:26
还是我们自定View的那几个步骤:
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
3、重写onMesure (不是必须)
4、重写onDraw
自定义View的属性
<?xml version="1.0" encoding="utf-8"?><resources><attr name="firstColor" format="color" /> <attr name="secondColor" format="color" /> <attr name="circleWidth" format="dimension" /> <attr name="speed" format="integer" /> <declare-styleable name="progressStyle"> <attr name="firstColor"/> <attr name="secondColor"/> <attr name="circleWidth"/> <attr name="speed"/> </declare-styleable></resources>
自定义View,并且使用自定义的View
public class ProgressView extends View { /** * 第一圈的颜色 */ private int mFirstColor; /** * 第二圈的颜色 */ private int mSecondColor; /** * 圈的宽度 */ private int mCircleWidth; /** * 画笔 */ private Paint mPaint; /** * 当前进度 */ private int mProgress; /** * 速度 */ private int mSpeed; /** * 是否应该开始下一个 */ private boolean isNext = false; public ProgressView(Context context) { this(context, null); } public ProgressView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ProgressView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.progressStyle,defStyleAttr,0); int n = typedArray.getIndexCount(); for (int i =0 ;i < n ; i ++){ int attr =typedArray.getIndex(i); switch (attr){//这里的0,1,2,3对应attrs中declare-styleable name="progressStyle"数组元素的顺序,我是为了举例方便,实际开发中不要这样写 case 0: mFirstColor = typedArray.getColor(attr, Color.BLACK); break; case 1: mSecondColor = typedArray.getColor(attr, Color.RED); break; case 2: mCircleWidth = typedArray.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16,getResources().getDisplayMetrics())); break; case 3: mSpeed = typedArray.getInt(attr,20); break; } } typedArray.recycle(); mPaint = new Paint(); startMyThread(); } @Override protected void onDraw(Canvas canvas) { int center = getWidth() / 2; // 获取圆心的x坐标 int radius = (center - mCircleWidth)/2 ;// 半径 mPaint.setAntiAlias(true); mPaint.setStrokeWidth(mCircleWidth); mPaint.setStyle(Paint.Style.STROKE); RectF rectf = new RectF(center-radius,center-radius,center+radius,center+radius);//颜色的切换 if(!isNext){ canvas.save(); mPaint.setColor(mFirstColor);// 设置圆环的颜色 canvas.drawCircle(center,center,radius,mPaint);//划出圆圈 mPaint.setColor(mSecondColor); canvas.drawArc(rectf,-90,mProgress,false,mPaint);//根据进度画圆弧 canvas.restore(); }else { canvas.save(); mPaint.setColor(mSecondColor);// 设置圆环的颜色 canvas.drawCircle(center,center,radius,mPaint); mPaint.setColor(mFirstColor); canvas.drawArc(rectf,-90,mProgress,false,mPaint); canvas.restore(); } } private void startMyThread() { new Thread(new Runnable() { @Override public void run() { while (true){ mProgress++;//进度 if(mProgress == 360){//当360度时候值变为初始状态 mProgress = 0; if(!isNext){//设置是否切换颜色开关 isNext = true; }else { isNext = false; } } postInvalidate(); try { Thread.sleep(mSpeed); }catch (InterruptedException e){ e.printStackTrace(); } } } }).start();; }<strong></strong>
以上代码就是自定义View的全部代码,使用的话没什么多说的 直接在Xml中引用这个新建的ProgressView就可以了
重画ondraw 不多解释直接看代码
@Override protected void onDraw(Canvas canvas) { int center = getWidth() / 2; // 获取圆心的x坐标 int radius = (center - mCircleWidth)/2 ;// 半径 mPaint.setAntiAlias(true); mPaint.setStrokeWidth(mCircleWidth); mPaint.setStyle(Paint.Style.STROKE); RectF rectf = new RectF(center-radius,center-radius,center+radius,center+radius); if(!isNext){ canvas.save(); mPaint.setColor(mFirstColor);// 设置圆环的颜色 canvas.drawCircle(center,center,radius,mPaint);//划出圆圈 mPaint.setColor(mSecondColor); canvas.drawArc(rectf,-90,mProgress,false,mPaint);//根据进度画圆弧 canvas.restore(); }else { canvas.save(); mPaint.setColor(mSecondColor);// 设置圆环的颜色 canvas.drawCircle(center,center,radius,mPaint); mPaint.setColor(mFirstColor); canvas.drawArc(rectf,-90,mProgress,false,mPaint); canvas.restore(); } }
效果是不是和progress相似呢 ,自己试试看吧
因为有的人说效果很生硬,我就做了个完整的gif图,速度是可以调节的,根据不同的速度值,移动可以调剂频率
0 0
- 【Android自定义控件】圆圈交替,仿progress效果
- android自定义控件(三)圆环交替等待效果
- Android自定义控件--仿 path 效果 ArcMenu
- Android 自定义View 圆环交替 等待效果
- Android 自定义View--圆环交替等待效果
- Android自定义控件之自定义下载progress
- Android 自定义控件 仿MX 播放器的SeekBar效果
- Android自定义控件——点赞效果(仿Twitter)
- 自定义控件 | 仿《最美有物》点赞效果
- Android 自定义View (三) 圆环交替 等待效果
- Android 自定义View (三) 圆环交替 等待效果
- Android 自定义View (三) 圆环交替 等待效果
- Android 自定义View (三) 圆环交替 等待效果
- Android 自定义View (三) 圆环交替 等待效果
- Android 自定义View (三) 圆环交替 等待效果
- Android 自定义View (三) 圆环交替 等待效果
- Android 自定义View (三) 圆环交替 等待效果
- Android 自定义View (二) 圆环交替 等待效果
- cocos2dx lua 和 quickcocos2dx lua需知(持续添加)
- 职场分享:职场中如何释放自己的工作压力
- 约瑟夫环问题
- Hadoop配置项整理(hdfs-site.xml)
- XX cannot be resolved to a type "eclipse报错及解决说明
- 【Android自定义控件】圆圈交替,仿progress效果
- ThreadLocal、Synchronized针对多线程的处理
- Linux 下ffmpeg 编译时提示 libx264找不到
- 我们学习编程语言,是要学习它的语法
- hdu 2065 "红色病毒"问题(快速幂)
- 对TCP/IP网络协议的深入浅出归纳
- 图片加载框架---UniversalImageLoader使用(一)
- PHP工程师招聘 外资 待遇优厚
- 高考低分生如何求学?