下面列出了android.graphics.Canvas#drawRoundRect ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
protected void onDraw(Canvas canvas) {
int canvasWidth = canvas.getWidth();
int canvasHeight = canvas.getHeight();
int layerId = canvas.saveLayer(0, 0, canvasWidth, canvasHeight, null, Canvas.ALL_SAVE_FLAG);
{
bgPaint.setColor(bgColor);
// draw the background of progress
canvas.drawRoundRect(bgRect, rectRadius, rectRadius, bgPaint);
// draw progress
canvas.drawRect(progressRect, progressPaint);
bgPaint.setXfermode(null);
if (bitmap != null) {
//draw icon
canvas.drawBitmap(bitmap, srcRect, dstRect, bgPaint);
}
}
canvas.restoreToCount(layerId);
// TODO: 弄明白为什么在xml预览中,canvas.restoreToCount
// TODO: 会导致后续的canvas对象为空 但canvas.restore方法则不会导致这个问题
// canvas.restore();
// canvas.save();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mFraction * mViewTranslationX, 0);
canvas.drawRoundRect(mRectF, mCircleRadius, mCircleRadius, mBgPaint); //嗷~ 在这画背景线
mDstPath.reset();
mPathMeasure.getSegment(0 ,mPathLength / 2 * mFraction, mDstPath, true);
canvas.drawPath(mDstPath, mPaint); //嗷~ 在这画上半圈
mDstPath.reset();
mPathMeasure.getSegment(mPathLength - mPathLength / 2 * mFraction ,mPathLength, mDstPath, true);
canvas.drawPath(mDstPath, mPaint); //嗷~ 在这画下半圈
mColorPaint.setColor(mCurrentColor);
if (mFraction <= 0.8 && mFraction > 0.2) { //嗷~ 在这画球
canvas.drawCircle(mCenterX - mCircleRadius + 2 * mCircleRadius * mFraction , mCenterY , mCircleRadius / 6 / 0.6f * (mFraction - 0.2f) , mColorPaint);
} else if (mFraction > 0.8) {
canvas.drawCircle(mCenterX - mCircleRadius + 2 * mCircleRadius * mFraction , mCenterY , mCircleRadius / 6 , mColorPaint);
}
canvas.restore();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float rectRadius = mHeight / 2f;
mRect.set(0, 0, mWidth, mHeight);
mRectF.set(mRect);
canvas.drawRoundRect(mRectF, rectRadius, rectRadius, mIsOpen ? mPaintTrack : mPaintPadding);
mRect.set((int) mPadding, (int) mPadding, (int) (mWidth - mPadding), (int) (mHeight - mPadding));
mRectF.set(mRect);
canvas.drawRoundRect(mRectF, rectRadius, rectRadius, mPaintTrack);
float c0 = mHeight / 2;
float c1 = mWidth - mHeight / 2;
float start = !mIsOpen ? c1 : c0;
float end = mIsOpen ? c1 : c0;
float offsetX = start + (end - start) * mFactor; // 通过属性动画因子,计算此瞬间圆心的横坐标
canvas.drawCircle(offsetX, mHeight / 2, mHeight / 2 - mPadding, mPaintShader);
}
private void createColorTableBitmap() {
Canvas c = new Canvas(bitmapForColor);
RectF rf = new RectF(0, 0, bitmapForColor.getWidth(), bitmapForColor.getHeight());
// 圆角大小
int r;
if (orientation == Orientation.HORIZONTAL) {
r = bitmapForColor.getHeight() / 2;
} else {
r = bitmapForColor.getWidth() / 2;
}
// 先绘制黑色背景,否则有 alpha 时绘制不正常
paint.setColor(Color.BLACK);
c.drawRoundRect(rf, r, r, paint);
paint.setShader(linearGradient);
c.drawRoundRect(rf, r, r, paint);
paint.setShader(null);
needReDrawColorTable = false;
}
@Override public void onMarkerViewDraw(Canvas canvas, String[] markerText) {
canvas.drawRoundRect(markerInsets, attribute.markerBorderRadius, attribute.markerBorderRadius,
markerBorderPaint);
canvas.drawText(markerText[1],
markerInsets.left + markerInsets.width() / 2,
markerInsets.top + (markerInsets.height() + textRect.height()) / 2,
markerTextPaint);
}
@Override
public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final TextureAtlasSourceDecoratorOptions pDecoratorOptions) {
final float left = pDecoratorOptions.getInsetLeft();
final float top = pDecoratorOptions.getInsetTop();
final float right = pCanvas.getWidth() - pDecoratorOptions.getInsetRight();
final float bottom = pCanvas.getHeight() - pDecoratorOptions.getInsetBottom();
this.mRectF.set(left, top, right, bottom);
pCanvas.drawRoundRect(this.mRectF, this.mCornerRadiusX, this.mCornerRadiusY, pPaint);
}
private void drawDiagonalFromTopRightRoundRect(Canvas canvas, Paint paint, float right,
float bottom) {
canvas.drawRoundRect(new RectF(right - diameter, margin, right, margin + diameter), radius,
radius, paint);
canvas.drawRoundRect(new RectF(margin, bottom - diameter, margin + diameter, bottom),
radius, radius, paint);
canvas.drawRect(new RectF(margin, margin, right - radius, bottom - radius), paint);
canvas.drawRect(new RectF(margin + radius, margin + radius, right, bottom), paint);
}
/**
* Draw mProgress on view based on mLoaderType.
* @param canvas - view canvas object
*/
public void onDrawProgress(Canvas canvas) {
RectF bgRectf = new RectF(topX, topY, canvas.getWidth(), canvas.getHeight());
canvas.drawRoundRect(bgRectf, mCornerRadius, mCornerRadius, mBackgroundPaint);
float progressPoint = (((float) canvas.getWidth()/ MAX) * mProgress);
RectF progRect = new RectF(topX, topY, progressPoint, canvas.getHeight());
canvas.drawRoundRect(progRect, mCornerRadius, mCornerRadius, mProgressPaint);
}
private void drawOtherTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, bottom), radius, radius,
paint);
canvas.drawRoundRect(new RectF(margin, bottom - diameter, right, bottom), radius, radius,
paint);
canvas.drawRect(new RectF(margin + radius, margin, right, bottom - radius), paint);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (isChecked()) {
paint.reset();
paint.setAntiAlias(true);
bounds.set(minDim / 10, minDim / 10, minDim - (minDim / 10), minDim - (minDim / 10));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
paint.setColor(getResources().getColor(R.color.colorAccent, context.getTheme()));
} else {
paint.setColor(getResources().getColor(R.color.colorAccent));
}
canvas.drawRoundRect(bounds, minDim / 8, minDim / 8, paint);
paint.setColor(Color.parseColor("#FFFFFF"));
paint.setStrokeWidth(minDim / 10);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.BEVEL);
canvas.drawPath(tick, paint);
} else {
paint.reset();
paint.setAntiAlias(true);
bounds.set(minDim / 10, minDim / 10, minDim - (minDim / 10), minDim - (minDim / 10));
paint.setColor(Color.parseColor("#C1C1C1"));
canvas.drawRoundRect(bounds, minDim / 8, minDim / 8, paint);
bounds.set(minDim / 5, minDim / 5, minDim - (minDim / 5), minDim - (minDim / 5));
paint.setColor(Color.parseColor("#FFFFFF"));
canvas.drawRect(bounds, paint);
}
}
public static Bitmap getRoundedCornerAndLightenBitmap(Bitmap bitmap, int cornerRadiusInPixels, boolean captureCircle) {
Bitmap output = Bitmap.createBitmap(
bitmap.getWidth(),
bitmap.getHeight(),
Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(output);
final int color = 0xffffffff;
final Paint paint = new Paint();
final Rect rect = new Rect(0,
0,
bitmap.getWidth(),
bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = cornerRadiusInPixels;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
if (captureCircle) {
canvas.drawCircle(rectF.centerX(),
rectF.centerY(),
bitmap.getWidth() / 2,
paint);
} else {
canvas.drawRoundRect(rectF,
roundPx,
roundPx,
paint);
}
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
ColorFilter filter = new LightingColorFilter(0xFFFFFFFF, 0x00222222); // lighten
//ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); // darken
paint.setColorFilter(filter);
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void drawRoundRectAfterLollipop(Canvas canvas) {
canvas.drawRoundRect(getCenterX() - (currentWidth / 2),
getCenterY() - (currentHeight / 2),
getCenterX() + (currentWidth / 2),
getCenterY() + (currentHeight / 2),
10f,
10f,
getShapePaint());
}
public Bitmap getRoundedCornerBitmap(Context context, Bitmap input,
int pixels, int w, int h, boolean squareTL, boolean squareTR,
boolean squareBL, boolean squareBR) {
Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final float densityMultiplier = context.getResources()
.getDisplayMetrics().density;
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, w, h);
final RectF rectF = new RectF(rect);
// make sure that our rounded corner is scaled appropriately
final float roundPx = pixels * densityMultiplier;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
// draw rectangles over the corners we want to be square
if (squareTL) {
canvas.drawRect(0, 0, w / 2, h / 2, paint);
}
if (squareTR) {
canvas.drawRect(w / 2, 0, w, h / 2, paint);
}
if (squareBL) {
canvas.drawRect(0, h / 2, w / 2, h, paint);
}
if (squareBR) {
canvas.drawRect(w / 2, h / 2, w, h, paint);
}
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(input, 0, 0, paint);
return output;
}
private void drawBottomRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(right - diameter, bottom - diameter, right, bottom), radius,
radius, paint);
canvas.drawRect(new RectF(margin, margin, right - radius, bottom), paint);
canvas.drawRect(new RectF(right - radius, margin, right, bottom - radius), paint);
}
private void drawBottomRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, bottom - diameter, right, bottom), radius, radius,
paint);
canvas.drawRect(new RectF(margin, margin, right, bottom - radius), paint);
}
/**绘制图表*/
@Override
public void drawChart(Canvas canvas) {
int topY = top + mMoveLen;
paintLabel.setTextSize(textSize);
int lableH =(int) FontUtil.getFontHeight(paintLabel);
int lableL =(int) FontUtil.getFontLeading(paintLabel);
paint.setStyle(Paint.Style.FILL);
int index = -1;
for(int i = 0; i < dataList.size(); i++){
PieChartBean bean = dataList.get(i);
if(bean.getNum() == 0 && !showZeroPart){
continue;
}
index++;
paint.setARGB(255, arrColorRgb[index%arrColorRgb.length][0], arrColorRgb[index%arrColorRgb.length][1], arrColorRgb[index%arrColorRgb.length][2]);
paintLabel.setARGB(255, arrColorRgb[index%arrColorRgb.length][0], arrColorRgb[index%arrColorRgb.length][1], arrColorRgb[index%arrColorRgb.length][2]);
int rectTop = topY+(oneLableHeight-rectH)/2;
RectF rect = new RectF(leftSpace, rectTop, leftSpace+rectW, rectTop+rectH);
canvas.drawRoundRect(rect, rectRaidus, rectRaidus, paint);
if(textColor!=0) {
paintLabel.setColor(textColor);
}
rectTop = topY+(oneLableHeight-lableH)/2;
canvas.drawText(bean.getName(), leftSpace+rectW+leftSpace , rectTop+lableL , paintLabel);
float textW = FontUtil.getFontlength(paintLabel, bean.getName());
/**5、绘制指示标签*/
if(MODUL_LABLE == tagModul){
String tagText = "";
if (tagType == PieChartLayout.TAG_TYPE.TYPE_NUM) {
tagText = bean.getNum() + "";
} else if (tagType == PieChartLayout.TAG_TYPE.TYPE_PERCENT) {
DecimalFormat decimalFormat = new DecimalFormat("0.0%");
tagText = decimalFormat.format(((float) bean.getNum() / (float) total));
}
float tagW = FontUtil.getFontlength(paintLabel, tagText);
canvas.drawText(tagText, getMeasuredWidth()-tagW- DensityUtil.dip2px(getContext(),3), rectTop+lableL , paintLabel);
/* DashPathEffect dashPathEffect = new DashPathEffect(new float[]{8,10,8,10}, 0);
paint.setColor(Color.RED);
// paint.setPathEffect(dashPathEffect);
paint.setStrokeWidth(4);
Path path = new Path();
path.moveTo(leftSpace+rectW+leftSpace+textW, rectTop);
path.lineTo(getMeasuredWidth()-tagW- DensityUtil.dip2px(getContext(),3), rectTop);
LogUtil.i(TAG, "绘制虚线"+path);
canvas.drawPath(path,paint);*/
}
topY += oneLableHeight + rectSpace;
}
}
private void drawTimeAndBackground(@NonNull final Canvas canvas,
@NonNull final String hour,
@NonNull final String minute,
@NonNull final String second) {
// background
canvas.save();
canvas.translate(paddingLeft, paddingTop);
canvas.drawRoundRect(backgroundRectF, rectRadius, rectRadius, backgroundPaint);
// border
this.drawRectBorder(canvas, backgroundRectF, rectRadius, rectBorderPaint);
canvas.drawText(hour, backgroundRectF.centerX(), timePaintBaseLine, timePaint);
canvas.restore();
// colon
canvas.save();
canvas.translate(firstTranslateColonX, paddingTop);
canvas.drawText(COLON, 0, timePaintBaseLineFixed, colonPaint);
canvas.restore();
// background
canvas.save();
canvas.translate(firstTranslateX, paddingTop);
canvas.drawRoundRect(backgroundRectF, rectRadius, rectRadius, backgroundPaint);
// border
this.drawRectBorder(canvas, backgroundRectF, rectRadius, rectBorderPaint);
canvas.drawText(minute, backgroundRectF.centerX(), timePaintBaseLine, timePaint);
canvas.restore();
// colon
canvas.save();
canvas.translate(secondTranslateColonX, paddingTop);
canvas.drawText(COLON, 0, timePaintBaseLineFixed, colonPaint);
canvas.restore();
// background
canvas.save();
canvas.translate(secondTranslateX, paddingTop);
canvas.drawRoundRect(backgroundRectF, rectRadius, rectRadius, backgroundPaint);
// border
this.drawRectBorder(canvas, backgroundRectF, rectRadius, rectBorderPaint);
canvas.drawText(second, backgroundRectF.centerX(), timePaintBaseLine, timePaint);
canvas.restore();
}
public void draw(Canvas canvas) {
Paint indexbarPaint = new Paint();
indexbarPaint.setColor(Color.parseColor(indexbarBackgroudColor));
indexbarPaint.setAlpha(indexbarBackgroudAlpha);
indexbarPaint.setAntiAlias(true);
canvas.drawRoundRect(mIndexbarRect, setIndexBarCornerRadius * mDensity, setIndexBarCornerRadius * mDensity, indexbarPaint);
if (mSections != null && mSections.length > 0) {
// Preview is shown when mCurrentSection is set
if (mCurrentSection >= 0) {
Paint previewPaint = new Paint();
previewPaint.setColor(Color.BLACK);
previewPaint.setAlpha(96);
previewPaint.setAntiAlias(true);
previewPaint.setShadowLayer(3, 0, 0, Color.argb(64, 0, 0, 0));
Paint previewTextPaint = new Paint();
previewTextPaint.setColor(Color.WHITE);
previewTextPaint.setAntiAlias(true);
previewTextPaint.setTextSize(50 * mScaledDensity);
previewTextPaint.setTypeface(setTypeface);
float previewTextWidth = previewTextPaint.measureText(mSections[mCurrentSection]);
float previewSize = 2 * mPreviewPadding + previewTextPaint.descent() - previewTextPaint.ascent();
RectF previewRect = new RectF((mListViewWidth - previewSize) / 2
, (mListViewHeight - previewSize) / 2
, (mListViewWidth - previewSize) / 2 + previewSize
, (mListViewHeight - previewSize) / 2 + previewSize);
canvas.drawRoundRect(previewRect, 5 * mDensity, 5 * mDensity, previewPaint);
canvas.drawText(mSections[mCurrentSection], previewRect.left + (previewSize - previewTextWidth) / 2 - 1
, previewRect.top + mPreviewPadding - previewTextPaint.ascent() + 1, previewTextPaint);
fade(300);
}
Paint indexPaint = new Paint();
indexPaint.setColor(Color.parseColor(indexbarTextColor));
indexPaint.setAntiAlias(true);
indexPaint.setTextSize(setIndexTextSize * mScaledDensity);
indexPaint.setTypeface(setTypeface);
float sectionHeight = (mIndexbarRect.height() - 2 * mIndexbarMargin) / mSections.length;
float paddingTop = (sectionHeight - (indexPaint.descent() - indexPaint.ascent())) / 2;
for (int i = 0; i < mSections.length; i++) {
float paddingLeft = (mIndexbarWidth - indexPaint.measureText(mSections[i])) / 2;
canvas.drawText(mSections[i], mIndexbarRect.left + paddingLeft
, mIndexbarRect.top + mIndexbarMargin + sectionHeight * i + paddingTop - indexPaint.ascent(), indexPaint);
}
}
}
/**
* 绘制表结构
*
* @param canvas
*/
private void dataView(Canvas canvas) {
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.FILL);
mPath.reset();
for (int i = 0; i < mArrayBoxes.size(); i++) {
LinkedNode box = mArrayBoxes.get(i);
mPaint.setColor(box.color);
canvas.drawRoundRect(
box.x, box.y, box.x + Cons.BOX_WIDTH, box.y + Cons.BOX_HEIGHT,
BOX_RADIUS, BOX_RADIUS, mPaint);
mPath.moveTo(box.x, box.y);
mPath.rCubicTo(Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2,
Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2, Cons.BOX_WIDTH, 0);
if (i < mArrayBoxes.size() - 1 ) {
LinkedNode box_next = mArrayBoxes.get(i + 1);
LinkedNode box_now = mArrayBoxes.get(i);
if (i % LINE_ITEM_NUM == LINE_ITEM_NUM - 1) {//边界情况
mPath.rLineTo(0, Cons.BOX_HEIGHT);
mPath.lineTo(box_next.x + Cons.BOX_WIDTH, box_next.y);
mPath.rLineTo(Cons.ARROW_DX, -Cons.ARROW_DX);
mPath.moveTo(box_next.x, box_next.y);
mPath.lineTo(box_now.x, box_now.y+Cons.BOX_HEIGHT);
mPath.rLineTo(-Cons.ARROW_DX, Cons.ARROW_DX);
} else {
mPath.rLineTo(0, Cons.BOX_HEIGHT / 2.2f);
mPath.lineTo(box_next.x+Cons.BOX_WIDTH * 0.2f, box_next.y + Cons.BOX_HEIGHT / 2f);
mPath.rLineTo(-Cons.ARROW_DX, -Cons.ARROW_DX);
mPath.moveTo(box_next.x, box_next.y);
mPath.rLineTo(0, Cons.BOX_HEIGHT / 1.2f);
mPath.lineTo(box_now.x + Cons.BOX_WIDTH * 0.8f, box_now.y + Cons.BOX_HEIGHT * 0.8f);
mPath.rLineTo(Cons.ARROW_DX, Cons.ARROW_DX);
}
}
canvas.drawPath(mPath, mPathPaint);
canvas.drawText(box.index + "",
box.x + Cons.BOX_WIDTH / 2,
box.y + 3 * OFFSET_OF_TXT_Y, mTxtPaint);
canvas.drawText(box.data + "",
box.x + Cons.BOX_WIDTH / 2,
box.y + Cons.BOX_HEIGHT / 2 + 3 * OFFSET_OF_TXT_Y, mTxtPaint);
}
}
/**
* 获得圆角图片的方法
*/
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}