效果图:

实现代码:
package com.chenjun.jun_0709_pointstouch;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
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_tow extends View{
public MyView_tow(Context context) {
super(context);
}
public MyView_tow(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyView_tow(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyView_tow(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置空心
paint.setStyle(Paint.Style.STROKE);
if(circles.size()!=0){//有圆
//循环圆
for (int i=0;i<circles.size();) {
//circle:0下标为圆心X坐标,1下标为圆心Y坐标,2下标为圆半径
Float[] circle=circles.get(i);
if(circle[2]==500){//圆半径为500时,删除圆
circles.remove(i);
}else{//否则下标移到下一个圆
i++;
}
//画圆
canvas.drawCircle(circle[0],circle[1],circle[2],paint);
//每次半径加20
circle[2]+=20;
}
}
}
//画笔
private Paint paint=new Paint();
//辅助线程
private Handler handler=new Handler();
//圆集合
private List<Float[]> circles=new ArrayList<>();
//线程
private Runnable myRunnable=new Runnable(){
@Override
public void run() {
if(circles.size()>0){//有圆
//重绘
postInvalidate();
//0.1秒后再次执行该线程
handler.postDelayed(myRunnable,100);
}else{
//重绘
postInvalidate();
//移除当前运行的线程
handler.removeCallbacks(myRunnable);
}
}
};
//所有圆的初始半径
private float f=0;
@Override
public boolean onTouchEvent(MotionEvent event) {
int action=event.getAction();
//当前手指ID
int pointIndex=action>>8;
//手指状态
int action_code=action & 0x000000ff;
//按下时
if(action_code==0||action_code==5){
//增加一个圆
circles.add(new Float[]{event.getX(pointIndex),event.getY(pointIndex),f});
//先移除正在运行的线程
handler.removeCallbacks(myRunnable);
//再重新启动线程
handler.post(myRunnable);
}
return true;
}
}