自定义动态圆形ProgressBar_(二)
来源:互联网 发布:gradle java 版本 编辑:程序博客网 时间:2024/06/06 06:55
项目下载地址:http://download.csdn.net/detail/fkgjdkblxckvbxbgb/9729162
上一篇文章的大概思想我已经说了,这一篇主要是展示细节工作,自定义属性,测量尺寸,以及一些异常情况的处理
如果有兴趣了解绘图方式,可以去看文件一,源代码下面可以提供下载
====================================================
自定义属性
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="MyView"> <attr name="viewbg" format="color" /> <attr name="progresscolor" format="color" /> <attr name="progresswidth" format="dimension" /> <attr name="textsize" format="dimension" /> <attr name="textcolor" format="color" /> </declare-styleable></resources>
布局文件=======================================
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > <com.cdl.demo.MyView android:id="@+id/myview" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" app:progresscolor="#BA55D3" app:progresswidth="20dp" app:textcolor="#ffffff" app:textsize="20dp" app:viewbg="#B0C4DE" /></RelativeLayout>
=================================================
Activity中的引用
package com.cdl.demo;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity { MyView myview; @Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myview = (MyView) findViewById(R.id.myview); myview.setProgress(80);//}}==================提供两种方法来绘图=================================
1:在主线程中去绘制
2:开线程绘制
个人觉得两个没什么多大的区别,
===============主线程绘制====================================
package com.cdl.demo;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Cap;import android.graphics.Rect;import android.graphics.RectF;import android.util.AttributeSet;import android.view.View;public class MyView extends View {Paint mPaint;/** 画笔的宽度 */int PROGRESS_WIDTH;/** 半径 */int circleRadius;/** 文字的描述 */String textDesc;/** 文字的大小尺寸 */int TEXT_SIXE;int TEXT_COLOR;int progress = 0;private int PROGRESS_BG;private int PROGRESS_COLOR;boolean running = true;/** 开启线程绘制View */// MyThread myThread;/** 画弧度递增的变量 */private int sweepAngle = 0;public MyView(Context context) {this(context, null);}public MyView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MyView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.MyView);PROGRESS_BG = ta.getColor(R.styleable.MyView_viewbg, 0xffffffff);PROGRESS_COLOR = ta.getColor(R.styleable.MyView_progresscolor, 0xff7fc6f8);TEXT_COLOR = ta.getColor(R.styleable.MyView_textcolor, 0xff9A32CD);TEXT_SIXE = ta.getDimensionPixelOffset(R.styleable.MyView_textsize, 30);PROGRESS_WIDTH = ta.getDimensionPixelOffset(R.styleable.MyView_progresswidth, 30);ta.recycle();initView();}private void initView() {mPaint = new Paint();mPaint.setAntiAlias(true);// mPaint.setDither(true);// 设置抖动,颜色过渡更均匀mPaint.setStrokeCap(Cap.ROUND);}public int defaultWidth = 300;protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int widthSpecModel = MeasureSpec.getMode(widthMeasureSpec);int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);int heightSpecModel = MeasureSpec.getMode(heightMeasureSpec);int heightSpcSzie = MeasureSpec.getSize(heightMeasureSpec);if (widthSpecModel == MeasureSpec.AT_MOST & heightSpecModel == MeasureSpec.AT_MOST) {widthSpecSize = defaultWidth;heightSpcSzie = defaultWidth;circleRadius = defaultWidth;} else if (widthSpecModel == MeasureSpec.AT_MOST) {widthSpecSize = defaultWidth;circleRadius = defaultWidth;} else if (heightSpecModel == MeasureSpec.AT_MOST) {heightSpcSzie = defaultWidth;circleRadius = defaultWidth;}circleRadius = widthSpecSize;setMeasuredDimension(widthSpecSize, heightSpcSzie);}public void setProgress(int progress) {this.progress = progress;if (running) {System.out.println("====打断");running = false;}running = true;invalidate();}protected void onDraw(final Canvas canvas) {super.onDraw(canvas);/** 绘制背景 */drawbg(canvas);drawText(canvas);drawProgress(canvas);if (sweepAngle != progress) {sweepAngle++;invalidate();}}private void drawProgress(final Canvas canvas) {int width = getWidth();int height = getHeight();mPaint.setColor(PROGRESS_COLOR);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(PROGRESS_WIDTH);int left = width / 2 - circleRadius / 2 + PROGRESS_WIDTH / 2;int top = height / 2 - circleRadius / 2 + PROGRESS_WIDTH / 2;int right = width / 2 + circleRadius / 2 - PROGRESS_WIDTH / 2;int bottom = height / 2 + circleRadius / 2 - PROGRESS_WIDTH / 2;RectF oval1 = new RectF(left, top, right, bottom);int arc = sweepAngle * 360 / 100;canvas.drawArc(oval1, 0, arc, false, mPaint);// 小弧形}private void drawText(final Canvas canvas) {textDesc = sweepAngle + "%";final int width = getWidth();final int height = getHeight();final Rect bounds = new Rect();mPaint.setColor(TEXT_COLOR);mPaint.setStyle(Paint.Style.FILL);mPaint.setTextSize(TEXT_SIXE);mPaint.getTextBounds(textDesc, 0, textDesc.length(), bounds);canvas.drawText(textDesc, (width / 2) - (bounds.width() / 2), (height / 2) + (bounds.height() / 2), mPaint);}private void drawbg(Canvas canvas) {int width = getWidth();int height = getHeight();mPaint.setColor(PROGRESS_BG);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);mPaint.setStrokeWidth(PROGRESS_WIDTH);canvas.drawCircle(width / 2, height / 2, circleRadius / 2 - PROGRESS_WIDTH / 2, mPaint);}}
=====================开线程============================
package com.example.videodemo;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Cap;import android.graphics.Rect;import android.graphics.RectF;import android.util.AttributeSet;import android.view.View;public class MyView extends View {Paint mPaint;/** 画笔的宽度 */int PROGRESS_WIDTH;/** 半径 */int circleRadius;/** 文字的描述 */String textDesc;/** 文字的大小尺寸 */int TEXT_SIXE;/**文字的颜色*/int TEXT_COLOR;/**进度*/int progress = 0;/**控件的背景色*/private int PROGRESS_BG;/**进度的颜色*/private int PROGRESS_COLOR;boolean running = true;/** 开启线程绘制View */MyThread myThread;/** 画弧度递增的变量 */private int sweepAngle;public MyView(Context context) {this(context, null);}public MyView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MyView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr); //获取自定义的属性TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.MyView);PROGRESS_BG = ta.getColor(R.styleable.MyView_viewbg, 0xffffffff);PROGRESS_COLOR = ta.getColor(R.styleable.MyView_progresscolor, 0xff7fc6f8);TEXT_COLOR = ta.getColor(R.styleable.MyView_textcolor, 0xff9A32CD);TEXT_SIXE = ta.getDimensionPixelOffset(R.styleable.MyView_textsize, 30);PROGRESS_WIDTH = ta.getDimensionPixelOffset(R.styleable.MyView_progresswidth, 30);ta.recycle();initView();}private void initView() {mPaint = new Paint();mPaint.setAntiAlias(true);// mPaint.setDither(true);// 设置抖动,颜色过渡更均匀mPaint.setStrokeCap(Cap.ROUND);}/**如果用户设置wap_content,默认尺寸为300*/public int defaultWidth = 300;protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int widthSpecModel = MeasureSpec.getMode(widthMeasureSpec);int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);int heightSpecModel = MeasureSpec.getMode(heightMeasureSpec);int heightSpcSzie = MeasureSpec.getSize(heightMeasureSpec);if (widthSpecModel == MeasureSpec.AT_MOST & heightSpecModel == MeasureSpec.AT_MOST) {widthSpecSize = defaultWidth;heightSpcSzie = defaultWidth;circleRadius = defaultWidth;} else if (widthSpecModel == MeasureSpec.AT_MOST) {widthSpecSize = defaultWidth;circleRadius = defaultWidth;} else if (heightSpecModel == MeasureSpec.AT_MOST) {heightSpcSzie = defaultWidth;circleRadius = defaultWidth;}circleRadius = widthSpecSize;setMeasuredDimension(widthSpecSize, heightSpcSzie);}public void setProgress(int progress) {this.progress = progress;//用户频繁设置进度,防止界面异常,直接停止刷新,每次重新绘制if (running) {running = false;}running = true;invalidate();}protected void onDraw(final Canvas canvas) {super.onDraw(canvas);/** 绘制背景.背景只用绘制一次 */drawbg(canvas);if (myThread == null) {myThread = new MyThread();myThread.start();} else {drawText(canvas);drawProgress(canvas);}}// 开启一个子线程绘制uiprivate class MyThread extends Thread {@Overridepublic void run() {while (running) {logic();postInvalidate();try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}protected void logic() {sweepAngle += 1;mPaint.setColor(Color.RED);if (sweepAngle == progress) {running = false;}}private void drawProgress(final Canvas canvas) {/** 画笔旋转的角度 */int width = getWidth();int height = getHeight();mPaint.setColor(PROGRESS_COLOR);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(PROGRESS_WIDTH);int left = width / 2 - circleRadius / 2 + PROGRESS_WIDTH / 2;int top = height / 2 - circleRadius / 2 + PROGRESS_WIDTH / 2;int right = width / 2 + circleRadius / 2 - PROGRESS_WIDTH / 2;int bottom = height / 2 + circleRadius / 2 - PROGRESS_WIDTH / 2;RectF oval1 = new RectF(left, top, right, bottom);int arc = sweepAngle * 360 / 100;canvas.drawArc(oval1, 0, arc, false, mPaint);// 小弧形}private void drawText(final Canvas canvas) {textDesc = sweepAngle + "%";final int width = getWidth();final int height = getHeight();final Rect bounds = new Rect();mPaint.setColor(TEXT_COLOR);mPaint.setStyle(Paint.Style.FILL);mPaint.setTextSize(TEXT_SIXE);mPaint.getTextBounds(textDesc, 0, textDesc.length(), bounds);canvas.drawText(textDesc, (width / 2) - (bounds.width() / 2), (height / 2) + (bounds.height() / 2), mPaint);}private void drawbg(Canvas canvas) {int width = getWidth();int height = getHeight();mPaint.setColor(PROGRESS_BG);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);mPaint.setStrokeWidth(PROGRESS_WIDTH);canvas.drawCircle(width / 2, height / 2, circleRadius / 2 - PROGRESS_WIDTH / 2, mPaint);}}
0 0
- 自定义动态圆形ProgressBar_(二)
- 自定义动态圆形ProgressBar_(一)
- 自定义圆形进度条(二)
- Android中自定义圆形图片(二)
- 自定义圆形头像框二
- Android学习(二十)设置自定义圆形图片
- 自定义ProgressBar(圆形)
- 自定义view之动态圆形进度条
- 自定义view 动态圆形有百分比
- android自定义view-打造圆形ImageView(二)
- 自定义控件(二) 一个圆形钟表
- 【android实用工具 二】 自定义圆形文字头像
- 自定义进度条(水平,圆形)
- 自定义圆形图片(RoundImageView)
- 自定义圆形进度条(一)
- android开发自定义View(二)自定义圆形进度条
- Android自定义控件(二)——圆形进度条以及回调方法
- Android圆形ImageView(二)
- WebSphere注意事项之equals和==(1)
- Mybatis的ResultMap的使用
- 耗时近一个月,终于录完了VUE.JS2.0前端视频教程!
- eclipse汉化
- php有以下输出语句:
- 自定义动态圆形ProgressBar_(二)
- SQL语句优化方案
- Java 异常处理的误区和经验总结
- PAT 乙级 1022 D进制的A+B (20)
- 简单选择排序
- Java基础 - 图论之相关定义
- 微信小程序-合法域名校验出错
- Android Handler 实例化-->发送消息-->处理消息流程
- C#修改本地系统时间转载