效果图如下:
思路:
自定义(控件)UI+多点触摸--->实现检测手机支持的触摸的点数 触摸哪里哪里画一个圆(自己定义一个控件,1.给控件设触摸事件,2.触摸完之后画圆) 多个手指头画圆,即多点触摸事件 哪里抬起,哪里圆就消失
具体实现代码:
Circle.java
package com.zking.android19_pointstouch; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import java.util.Random; /** * 实体类:代表圆 */ public class Circle { public float x;//圆心 public float y; public int r=100;//半径 public int pointId;//通过id来标识:哪一个手指头抬起来哪一个圆就消失 int red;//3原色 int green; int blue; Random random=new Random();//随机数 public Circle(float x, float y, int pointId) { this.x = x; this.y = y; this.pointId = pointId; red=random.nextInt(255); green=random.nextInt(255); blue=random.nextInt(255); } //把圆画出来(画自己) public void drawSelf(Canvas canvas, Paint paint){//画布,画笔 paint.setColor(Color.rgb(red,green,blue));//给每个圆设置不同的颜色 3原色随机 canvas.drawCircle(x,y,r,paint); } } MyView.java package com.zking.android19_pointstouch; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.util.ArrayList; import java.util.List; /** * 多点触摸:同时触摸下去不允许抬起来 */ public class MyView extends View{//报错:Alt+回车-->4个方法 //定义一个圆的集合 List<Circle> circles=new ArrayList<>(); public MyView(Context context) { super(context); } public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } /** * onDraw:画东西的 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint=new Paint(); //循环 for (Circle circle : circles) { circle.drawSelf(canvas,paint);//调画的方法 } } //触摸事件 @Override public boolean onTouchEvent(MotionEvent event) { //获取手指的行为 int action=event.getAction(); int action_code=action&0xff;//多点触摸562 //手指的下标Index int pointIndex=action>>8;//右移8 //获取手指的坐标(新的坐标) float x=event.getX(pointIndex); float y=event.getY(pointIndex); //获取手指的名字ID(是哪一个圆) int pointId=event.getPointerId(pointIndex); if(action_code>=5){//写法2 action_code-=5; } //判断 switch (action_code) {//action.sw //case 5://多点触摸按下为5,0是单点触摸按下的所以就进不来 写法1 case MotionEvent.ACTION_DOWN://一按下就 Circle circle=new Circle(x,y,pointId);//实例化一个圆 circles.add(circle);//将圆添加到集合中 break; case MotionEvent.ACTION_UP://抬起就消失 circles.remove(get(pointId));//调用方法 break; case MotionEvent.ACTION_MOVE://表示移动 for (int i = 0; i <event.getPointerCount() ; i++) {//循环所有的圆 int id=event.getPointerId(i);//拿到id get(id).x=event.getX(i);//重新绘制 拿到圆相对应的属性 get(id).y=event.getY(i); } break; } //重新调用onDraw 重绘 invalidate();//主线程里面调 //postInvalidate();//子线程里面调 return true; } //方法目的:拿圆 public Circle get(int pointId){ for (Circle circle : circles) {//循环所以的圆 if(circle.pointId==pointId){//拿到每一个圆的id,如果等于你传过来的id return circle;//这个圆就是你想要的圆 } } return null; } } MainActivity.java package com.zking.android19_pointstouch; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); } }