-
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); //寬度,自動根據(jù)三種模式來計算 int height = resolveSize(expect, heightMeasureSpec); //高度,自動根據(jù)三種模式來計算 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時,設(shè)置筆刷的圖形樣式,如圓形樣式 Cap.ROUND,或方形樣式Cap.SQUARE */ }查看全部
-
自定義圓形進度條 繼承自HorizontalProgressbarWithProgress 1)自定義屬性 a) unreach bar 的height color b) reach bar的height color 以上這四種屬性已經(jīng)在水平進度條中定義過了,所以不需要再次定義 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中已經(jīng)指定了android:progress="50",奇怪的是在onDraw()中g(shù)etProgress()一直=0,而且其他任何的屬性值都可以正確獲??! 此問題我也遇到了查看全部
-
如何根據(jù)給定的measureSpec計算出 mode、size 并根據(jù)三種模式得出具體的測量值 EXACTLY AT_MOST UNSPECIFIED查看全部
-
圓形進度條 自己很早以前就寫過一個,這里不看了。 https://github.com/xzhang76/CustomedProgressBar查看全部
-
自定義屬性聲明與獲取查看全部
-
自定義控件的步驟 在本例子中,3、6這兩個步驟是不需要的,因為本例子不需要用到viewGroup,5也不需要,因為不需要處理用戶的點擊事件 7也不需要,因為progressBar控件本身已經(jīng)實現(xiàn)了狀態(tài)的保存與恢復(fù)查看全部
-
進度條完善 1.定時100ms更新進度的方法 如圖查看全部
-
繪制條形進度條 2.onDraw()的一些調(diào)整 假設(shè)沒有中間的text和offset,那么進度條長度應(yīng)該是progressX=ratio*mRealWidth 那么實際reached進度條應(yīng)該是reachX=progressX-mTextOffset/2-textWidth/2 (1)判斷reached進度條和text的長度是否已經(jīng)占滿進度條全長 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的位置應(yīng)該是進度條開始位置 canvas.drawText(text, progressX-textWidth/2, textY, mPaint); 3.getProgress()為什么=0? 在布局的xml中已經(jīng)指定了android:progress="50",奇怪的是在onDraw()中g(shù)etProgress()一直=0,而且其他任何的屬性值都可以正確獲??! 沒有找到原因,懷疑可能是和不同api版本有關(guān),我這里的解決方法是: 重寫setProgress(),調(diào)用postInvalidate()來重繪。 public synchronized void setProgress(int progress) { if (progress > getMax()) { progress = getMax(); } if (progress <= getMax()) { this.mProgress = progress; postInvalidate(); } }查看全部
舉報
0/150
提交
取消