这次呢,我们来做一个dome,使用多点触摸实现按下画圆,抬起消失的效果
我们先来缕一下思路:我们可以有一个圆的实体类,里面定义好圆的圆心坐标,半径,颜色,透明度的属性,具体代码如下:
package com.example.g160628_15; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; import java.util.Random; /** * Created by Administrator on 2017/7/9 0009. */ public class Circle { public float x; public float y; public int r = 100; public int pointId; int red; 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)); canvas.drawCircle(x,y,r,paint); } }我们有了这个实体类之后就是需要自定义UI来实现效果了,我们的思路是这样的,判断你的手指行动是按下,还是抬起,还是移动,然后分别执行不同代码即可,具体代码如下:
package com.example.g160628_15; 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; /** * Created by Administrator on 2017/7/9 0009. */ public class MyView extends View{ 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); } @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; int pointIndex=action>>8; float x = event.getX(pointIndex); float y = event.getY(pointIndex); int pointId = event.getPointerId(pointIndex); if(action_code>=5){ action_code-=5; } switch (action_code){ 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); get(id).x=event.getX(i); get(id).y=event.getY(i); } break; } invalidate(); return true; } public Circle get(int pointId){ for (Circle circle : circles) { if(circle.pointId==pointId){ return circle; } } return null; } }然后是主Activity
package com.example.g160628_15; 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)); } }至此,我们的效果就实现了,你还可以用这个dome检测你的手机有多少个触摸点哦
