Android 自定义View——动态进度条

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android 自定义View——动态进度条

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

代码

自定义View

public class ColorProgressBar extends View{

//下面这两行在本demo中没什么用,只是前几天看别人的代码时学到的按一定尺寸,设置其他尺寸的方式,自动忽略或者学习一下也不错

// private int defaultStepIndicatorNum= (int) TypedValue.applyDimension(PLEX_UNIT_DIP,40,getResources().getDisplay Metrics());

// 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+"mDia meter:"+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);

}

相关文档
最新文档