自定义控件之圆形的image
需要添加点击事件的的时候在自定义的控件中覆写OnTouchEvent();方法进行点击事件的分发
1 package com.example.administrator.mvp.ui.widget; 2 import android.content.Context; 3 import android.graphics.Bitmap; 4 import android.graphics.BitmapFactory; 5 import android.graphics.Canvas; 6 import android.graphics.Color; 7 import android.graphics.Paint; 8 import android.graphics.Path; 9 import android.graphics.PixelFormat; 10 import android.graphics.Rect; 11 import android.graphics.Region; 12 import android.graphics.drawable.BitmapDrawable; 13 import android.graphics.drawable.Drawable; 14 import android.util.AttributeSet; 15 import android.view.View; 16 import android.widget.ImageView; 17 18 import com.example.administrator.mvp.R; 19 20 21 /** 22 * 这里我们继承ImageView 23 * Created by Zyh on 2016/11/27. 24 */ 25 public class MyCycleImageView extends View { 26 /** 27 *方法的作用: 28 * 构造方法--主要进行变量的初始化 29 * onMeasure---主要对该控件的宽高进行重置 30 * onDraw---对需要显示的信息进行重绘 31 * 我们需要用到的工具: 32 * 1.画笔 33 * 2.位图 34 * 3.绘制的path路线 35 * 4.画布,这个有系统提供 36 * 37 */ 38 private Bitmap mBitmap; 39 private Paint mPaint; 40 private Path mPath; 41 private int dia;//显示的直径 42 public MyCycleImageView(Context context, AttributeSet attrs) { 43 //这个方法是系统默认要执行的方法 44 super(context, attrs); 45 mPaint=new Paint(); 46 //设置抗锯齿 47 mPaint.setAntiAlias(true); 48 mPaint.setStyle(Paint.Style.STROKE); 49 //设置画笔透明 50 mPaint.setAlpha(0); 51 mPath=new Path(); 52 } 53 @Override 54 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 55 //重新规定布局的宽和高 56 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 57 //图片的直径我们规定为宽高中最小的那个尺寸 58 dia=Math.min(MeasureSpec.getSize(widthMeasureSpec),MeasureSpec.getSize(heightMeasureSpec)); 59 //按比例创建位图 60 mBitmap=Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.chazhuo),dia,dia,false); 61 //设置路径为直径是dia的圆 62 mPath.addCircle(dia/2,dia/2,dia/2, Path.Direction.CW); 63 //这个方法是重新定义宽高的时候必须要执行的方法,否则会有异常 64 setMeasuredDimension(dia,dia); 65 } 66 67 @Override 68 protected void onDraw(Canvas canvas) { 69 //重新绘制控件 70 super.onDraw(canvas); 71 //绘制圆形的区域--可以为我们位图描边 72 canvas.drawPath(mPath,mPaint); 73 //按照路径裁剪画布,裁剪剩下的区域我们设置为交集 74 canvas.clipPath(mPath, Region.Op.INTERSECT); 75 canvas.drawBitmap(mBitmap,0,0,null); 76 } 77 }
效果如上图