-
3)onMeasure @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { mMaxpaintWidth = Math.max(mReachHeight, mUnReachHeight); //默认四个Padding一致 int expect = mRadius*2 + mMaxpaintWidth + getPaddingLeft() + getPaddingRight(); //总宽度默认值 int width = resolveSize(expect, widthMeasureSpec); //宽度,自动根据三种模式来计算 int height = resolveSize(expect, heightMeasureSpec); //高度,自动根据三种模式来计算 int readWidth = Math.min(width, height); //总宽度取最小值 //半径 =(总宽度-左边距-右边距-最大画笔宽度)/ 2 mRadius = (readWidth - getPaddingLeft() - getPaddingRight() - mMaxpaintWidth)/2; setMeasuredDimension(readWidth, readWidth); }查看全部
-
2)在自定义控件中进行读取自定义属性 mRadius = dp2px(30); //默认半径是30dp mMaxPaintWidth; //最大画笔宽度 public RoundProgressBarWithProgress(Context context, AttributeSet attrs) { super(context, attrs); mReachHeight = (int) (mUnReachHeight*2.5f); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.RoundProgressBarWithProgress, 0, 0); mRadius = (int) a.getDimension(R.styleable.RoundProgressBarWithProgress_radius, 10); a.recycle(); mPaint.setStyle(Paint.Style.STROKE); //画圆需要是空心的 mPaint.setAntiAlias(true); //抗锯齿 mPaint.setDither(true); //防抖动 mPaint.setStrokeCap(Paint.Cap.ROUND); /*当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式 Cap.ROUND,或方形样式Cap.SQUARE */ }查看全部
-
自定义圆形进度条 继承自HorizontalProgressbarWithProgress 1)自定义属性 a) unreach bar 的height color b) reach bar的height color 以上这四种属性已经在水平进度条中定义过了,所以不需要再次定义 c) 圆形半径 radius <declare-styleable name="RoundProgressBarWithProgress"> <!-- 自定义属性的使用 --> <attr name="radius" format="dimension"></attr> </declare-styleable>查看全部
-
onDraw时注意 canvas.save() canvas.translate()的使用查看全部
-
圆形进度条绘制时需要三部分 1)unreach bar:是一个整圆 2) reach bar:是一个弧 3) text:文本查看全部
-
resolveSize查看全部
-
TypeValue.app查看全部
-
画圆的onMeasure方法没有看懂。。。查看全部
-
3.getProgress()为什么=0? 在布局的xml中已经指定了android:progress="50",奇怪的是在onDraw()中getProgress()一直=0,而且其他任何的属性值都可以正确获取! 此问题我也遇到了查看全部
-
如何根据给定的measureSpec计算出 mode、size 并根据三种模式得出具体的测量值 EXACTLY AT_MOST UNSPECIFIED查看全部
-
圆形进度条 自己很早以前就写过一个,这里不看了。 https://github.com/xzhang76/CustomedProgressBar查看全部
-
自定义属性声明与获取查看全部
-
自定义控件的步骤 在本例子中,3、6这两个步骤是不需要的,因为本例子不需要用到viewGroup,5也不需要,因为不需要处理用户的点击事件 7也不需要,因为progressBar控件本身已经实现了状态的保存与恢复查看全部
-
进度条完善 1.定时100ms更新进度的方法 如图查看全部
-
绘制条形进度条 2.onDraw()的一些调整 假设没有中间的text和offset,那么进度条长度应该是progressX=ratio*mRealWidth 那么实际reached进度条应该是reachX=progressX-mTextOffset/2-textWidth/2 (1)判断reached进度条和text的长度是否已经占满进度条全长 if ((progressX + textWidth / 2) >= mRealWidth) { reachX = mRealWidth - textWidth - mTextOffset / 2; noNeedUnreach = true; } (2)如果reached进度条太小,reachX可能是负值 if (reachX > 0) { // 开始绘制 canvas.drawLine(0, 0, reachX, 0, mPaint); } else { progressX = textWidth / 2; } 这时画text的位置应该是进度条开始位置 canvas.drawText(text, progressX-textWidth/2, textY, mPaint); 3.getProgress()为什么=0? 在布局的xml中已经指定了android:progress="50",奇怪的是在onDraw()中getProgress()一直=0,而且其他任何的属性值都可以正确获取! 没有找到原因,怀疑可能是和不同api版本有关,我这里的解决方法是: 重写setProgress(),调用postInvalidate()来重绘。 public synchronized void setProgress(int progress) { if (progress > getMax()) { progress = getMax(); } if (progress <= getMax()) { this.mProgress = progress; postInvalidate(); } }查看全部
举报
0/150
提交
取消