Andrdoid自定义View之canvas.clipPath(path);

来源:互联网 发布:mac后台怎么关闭 编辑:程序博客网 时间:2024/05/17 22:39

根据path裁剪画布

canvas.clipPath(path);

Paste_Image.png

1.1如实现一张图片上面是圆角下面是直角,可裁剪画布。

public class RoundedImageView extends ImageView {      /*圆角的半径,依次为左上角xy半径,右上角,右下角,左下角*/      private float[] rids = {10.0f,10.0f,10.0f,10.0f,0.0f,0.0f,0.0f,0.0f,};      public RoundedImageView(Context context) {          super(context);      }      public RoundedImageView(Context context, AttributeSet attrs) {          super(context, attrs);      }      public RoundedImageView(Context context, AttributeSet attrs, int defStyleAttr) {          super(context, attrs, defStyleAttr);      }      /**      * 画图      * by Hankkin at:2015-08-30 21:15:53      * @param canvas      */      protected void onDraw(Canvas canvas) {          Path path = new Path();          int w = this.getWidth();          int h = this.getHeight();          /*向路径中添加圆角矩形。radii数组定义圆角矩形的四个圆角的x,y半径。radii长度必须为8*/          path.addRoundRect(new RectF(0,0,w,h),rids,Path.Direction.CW);          canvas.clipPath(path);          super.onDraw(canvas);      }  }  

![Uploading Paste_Image_483488.png …]

2.1如自定义View四个角都是圆角,

Paste_Image.png

private float[] rids = {15.0f, 15.0f, 15.0f, 15.0f, 15.0f, 15.0f, 15.0f, 15.0f,};//四个角都圆角... @Override    protected synchronized void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.save();//save、restore 图层的保存和回滚相关的方法 详见 http://blog.csdn.net/tianjian4592/article/details/45234419        canvas.translate(0, getHeight() / 2);//移动图层到垂直居中位置        float radio = getProgress() * 1.0f / getMax();        float realWidth = getWidth() - getPaddingLeft() - getPaddingRight();//实际宽度减去文字宽度        float progressX = radio * realWidth;        Path path = new Path();         /*向路径中添加圆角矩形。radii数组定义圆角矩形的四个圆角的x,y半径。radii长度必须为8*/        path.addRoundRect(new RectF(getPaddingLeft(),getPaddingTop()-HorizontalProgresReachHeight/2,realWidth,HorizontalProgresReachHeight/2), rids, Path.Direction.CW);        canvas.clipPath(path);        //绘制走完的进度线        mPaint.setColor(HorizontalProgresReachColor);        mPaint.setStrokeWidth(HorizontalProgresReachHeight);        //canvas.drawLine(getPaddingLeft(), getPaddingTop(), progressX, getPaddingTop(), mPaint);//直角 垂直在同一高度 float startY, float stopY 一样        RectF mRectF = new RectF(getPaddingLeft(),getPaddingTop()-HorizontalProgresReachHeight/2,(int)progressX,HorizontalProgresReachHeight/2);//圆角 int left, int top, int right, int bottom        canvas.drawRoundRect(mRectF,0,0,mPaint);//圆角矩形        //绘制未做走完的进度        if (progressX < getWidth() - getPaddingLeft() - getPaddingRight()) {//进度走完了,不再画未走完的            mPaint.setColor(HorizontalProgresUnReachColor);            mPaint.setStrokeWidth(HorizontalProgresUnReachHeight);            //canvas.drawLine(progressX, getPaddingTop(), getWidth() - getPaddingLeft() - getPaddingRight(), getPaddingTop(), mPaint);//垂直在同一高度 float startY, float stopY 一样            RectF mRectF2 = new RectF(progressX - 15 ,getPaddingTop()-HorizontalProgresUnReachHeight/2,realWidth,HorizontalProgresUnReachHeight/2);//圆角 int left, int top, int right, int bottom            canvas.drawRoundRect(mRectF2,0,0,mPaint);//圆角矩形        }        canvas.restore();    }

下一篇:Android自定义圆形进度条

代码已上传至Github




微信扫一扫关注我的以下微信公众号

【程序猿小白成长记】定期分享各类Java、Android等知识

定期分享IT知识,欢迎关注!

【每日哈哈笑一笑】笑一笑十年少,工作之余,别忘了放松下

午后休闲,微信扫一扫关注!

我的GitHub
我的CSDN
我的简书
开发笔记