效果图如下:
提示:由于效果图用的是夜神模拟器所以多点的触碰的效果没有显示出来
思路大纲:
1.获取手指的状态:按下,移动,移开。
2.按下的时候创建一个控件,并且加入控件数组。(在创建(画)控件的时候给画笔颜色设置随机)
3.获取手指移动的路径,赋给控件。
提示:无xml布局
代码如下:圆控件类 Circle.java
package com.example.androideighteen;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import java.util.Random;
/**
* Created by Administrator on 2017/7/8.
*/
public class Circle {
public float x;
public float y;
public int r = 100;
public int id;//手指的名字
int color;
int red;
int yellow;
int bule;
Random random = new Random();
public Circle(){
}
public Circle(float x, float y, int id) {
this.x = x;
this.y = y;
this.id = id;
}
/**
* 画自己
* @param canvas
*/
public void drawSelf(Canvas canvas, Paint paint){
red =random.nextInt(255);
yellow =random.nextInt(255);
bule =random.nextInt(255);
//设置随机颜色
color = Color.rgb(red,yellow,bule);
//设置画笔颜色
paint.setColor(color);
canvas.drawCircle(x,y,r,paint);
}
}
主要类:MyView.java
package com.example.androideighteen;
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/8.
*/
public class MyView extends View {
List<Circle> circles = new ArrayList<>();
private Paint paint;
public MyView(Context context) {
super(context);
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画圆
for (Circle circle : circles) {
circle.drawSelf(canvas,paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
//获取手指按下去的转态
int action_code = action & 0xff;
if(action_code>=5){
action_code-=5;
}
//得到每根手指的下标
int pointIndex = action>>8;
float x = event.getX();
float y = event.getY();
//得到每根手指的坐标
int id = event.getPointerId(pointIndex);
switch (action_code) {
case MotionEvent.ACTION_DOWN:
//执行按下的操作
//实例化圆
Circle circle = new Circle(x,y, id);
circles.add(circle);
break;
case MotionEvent.ACTION_MOVE:
//执行移动的操作
for (int i = 0; i <circles.size() ; i++) {
//根据i得到手指的ID
int id1 = event.getPointerId(i);
//根据id1得到圆
Circle c = getCircleById(id1);
//重新获取坐标
c.x = event.getX(i);
c.y = event.getY(i);
}
break;
case MotionEvent.ACTION_UP:
//执行抬起的操作
//circles.remove(id);
//得到是哪一根抬起,根据id找到圆
Circle c =getCircleById(id);
//将圆从集合中移除
circles.remove(c);
break;
}
//重绘 重新调用OnDraw 主线程中调用OnDraw
invalidate();
return true;
}
/**
* 根据id查询Circle数组里面的Circle
* @param id
* @return
*/
public Circle getCircleById(int id){
for (Circle circle : circles) {
if(circle.id==id){
return circle;
}
}
return null;
}
}
显示到页面上Activity类 MainActivity.java
package com.example.androideighteen;
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));
}
}
如有疑问,或者对本博文有什么见解,看法或者是建议,欢迎指出,谢谢。