public class BitmapAndTextView extends View {
Paint paint;//定义画笔 //第二步 MyClickListener listener; //定义监听事件 Region region; //定义全局区域 Region circleRegion;//切割圆形区域 /** * 构造函数 * @param context */ public BitmapAndTextView(Context context) { super(context); init(context); } /** * 构造函数 * @param context * @param attrs */ public BitmapAndTextView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context, attrs); } /** * 构造函数 * @param context * @param attrs * @param defStyleAttr */ public BitmapAndTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } /** * 初始化变量 * @param context */ private void init(Context context) { paint = new Paint(); paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); paint.setAntiAlias(true); region = new Region(); circleRegion = new Region(); } /** * 初始化变量,初始化自定义属性 * @param context * @param attrs */ private void init(Context context, AttributeSet attrs) { init(context); } /** * 测量控件大小 * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } /** * 获取最终控件大小 * @param w * @param h * @param oldw * @param oldh */ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); //设置全局区域范围(整个控件大小) Rect react = new Rect(0, 0, w, h); region.set(react); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //绘制图片 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); canvas.drawBitmap(bitmap, 200, 200, paint); //定义圆形区域路径 Path path = new Path(); path.addCircle(200, 200, 100, Path.Direction.CW); //切割圆形区域 circleRegion.setPath(path, region); //画圆形 canvas.drawPath(path, paint); } /** * 事件处理 * @param event * @return */ @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //第四步 (获取点击坐标) int x = (int) event.getX(); int y = (int) event.getY(); if (circleRegion.contains(x, y)) {//院内 if (listener != null) { listener.innerToast(this); } } else { if (listener != null) {//院外 listener.outerToast(this); } } break; default: break; } return super.onTouchEvent(event); } /** * 第三步 设置监听事件 * * @param listener */ public void setMyListener(MyClickListener listener) { this.listener = listener; } /** * 第一步定义点击事件接口 */ public interface MyClickListener { void innerToast(View view);//圆内 void outerToast(View view);//园外 } }
主页面
public class MainActivity extends AppCompatActivity { BitmapAndTextView myview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myview = (BitmapAndTextView) findViewById(R.id.myview); //第五步 myview.setMyListener(new BitmapAndTextView.MyClickListener() { @Override public void innerToast(View view) { Toast.makeText(getBaseContext(), "你点击了院内", Toast.LENGTH_SHORT).show(); } @Override public void outerToast(View view) { Toast.makeText(getBaseContext(), "你点击了院外", Toast.LENGTH_SHORT).show(); } }); } }