-
绘制条形进度条 1.onDraw() protected synchronized void onDraw(Canvas canvas) { canvas.save(); boolean noNeedUnreach; // reached String text = mProgress + "%"; float ratio = mProgress * 1.0f / getMax(); float progressX = ratio * mRealWidth; float reachX = progressX - mTextOffset / 2 - textWidth / 2; if ((progressX + textWidth / 2) >= mRealWidth) { reachX = mRealWidth - textWidth - mTextOffset / 2; noNeedUnreach = true; } if (reachX > 0) { ...... canvas.drawLine(0, 0, reachX, 0, mPaint); } else { progressX = textWidth / 2; } // text ...... canvas.drawText(text, progressX - textWidth / 2, textY, mPaint); // unreached if (!noNeedUnreach) { ...... canvas.drawLine(progressX + textWidth / 2 + mTextOffset / 2, 0, mRealWidth, 0, mPaint); } canvas.restore(); }查看全部
-
2.自定义控件的onMeasure(),这个是重点! (2)宽 因为对于宽度来说,必须由用户指定,所以要么是固定值,或者是match_parent (3)最后调用setMeasuredDimension()来确定view的宽和高 protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { /** * 对于宽度来说,因为必须由用户指定,要么是固定值或match_parent */ // int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthVal = MeasureSpec.getSize(widthMeasureSpec); int height = measureHeight(heightMeasureSpec); setMeasuredDimension(widthVal, height); mRealWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); } 3.小结 在onMeasure()这个方法中重要是确定view的高,一定要判断三种模式查看全部
-
1.获取自定义属性 自定义水平进度条共有7个自定义属性,在类初始化时给它们设置一个默认值,然后在构造函数中通过TypedArray来获取 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.HorizontalProgressBar); mTextSize = (int) typedArray.getDimension(R.styleable.HorizontalProgressBar_progress_text_size, mTextSize); mTextColor = mUnreachColor = mUnreachHeight = mReachColor = mReachHeight = mTextOffset = typedArray.recycle(); 2.自定义控件的onMeasure(),这个是重点! onMeasure()需要区分三种不同的模式,模式和数值是通过辅助类MeasureSpec从onMeasure()的两个参数中获取的。 在这里需要确定水平进度条的宽和高 (1)高 private int measureHeight(int height) { int result = 0; int heightMode = MeasureSpec.getMode(height); int heightSize = MeasureSpec.getSize(height); // 下面就是三种模式的判断 if (heightMode == EXACTLY) { result = heightSize; } else { /**如果是UNSPECIFIED 高度值应该是左边进度条高度,右边进度条高度,文字高度三者最大值加上上下的padding*/ …… if (heightMode == AT_MOST) { /**如果是AT_MOST 高度值应该是进度条本身高度和父布局测量的高度值两者的较小值*/ } } return result; }查看全部
-
自定义控件步骤查看全部
-
好难查看全部
-
三种模式查看全部
-
如何自定义控件 1.需要注意的点和步骤 如图 参考之前的笔记:http://www.imooc.com/note/579?sort=last&page=1&owner=mine 2.重新复习了一下卫星菜单和自定义的ViewPagerIndicator 3.自定义属性的使用 (1)attrs.xml声明 (2)layout布局中指定 (3)java代码中使用TypedArray获取并赋值 本项目中需要自定义的属性 (1)水平进度条两边的进度条颜色和宽度,中间数字部分的颜色和字体大小 (3)圆形进度条背景的颜色和宽度,进度条的颜色和宽度,中间数字部分查看全部
-
如何自定义控件查看全部
-
可以查看全部
-
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="progress_horizontal"> <attr name="progress_reach_color" format="color"></attr> <attr name="progress_reach_hight" format="dimension"></attr> <attr name="progress_unreach_color" format="color"></attr> <attr name="progress_unreach_hight" format="dimension"></attr> <attr name="progress_text_color" format="color"></attr> <attr name="progress_text_size" format="dimension"></attr> <attr name="progress_text_offset" format="dimension"></attr> </declare-styleable> </resources>查看全部
-
自定义控件步骤查看全部
-
这个方法是转变为标准尺寸的一个函数,例如 int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, context.getResources().getDisplayMetrics()); 这里COMPLEX_UNIT_SP是单位,20是数值,也就是20sp。查看全部
-
dp转换成px的函数查看全部
-
1233456查看全部
-
截图123查看全部
举报
0/150
提交
取消