package com.linin.view; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * 用于涂鸦的自定义view * * @author linin */ public class DrawView extends View { // 画笔颜色,默认红色 public int color = Color.RED; // 画笔宽度,默认5 public int paintWidth = 5; private Paint paint; private ArrayList<Point> allpoint = new ArrayList<Point>();// 保存全部的操做坐标 private ArrayList<ArrayList<Point>> historyPoints = new ArrayList<ArrayList<Point>>();// 用于记录涂鸦历史记录 public float dx = 0, dy = 0; public int index = -1;// 编辑评论的index public DrawView(Context context, AttributeSet attrs) {// 接收context,同时接收属性集合。 super(context, attrs);// 调用父类的构造 super.setOnTouchListener(new OnTouchListenerimpl()); paint = new Paint(); paint.setAntiAlias(true); } private class OnTouchListenerimpl implements OnTouchListener { private long currentTime = 0; private float dd = 300; public boolean onTouch(View v, MotionEvent event) { Point p = new Point((int) event.getX(), (int) event.getY());// 将坐标保存在Point类 if (event.getAction() == MotionEvent.ACTION_DOWN) { // 用户按下 DrawView.this.allpoint = new ArrayList<Point>();// 重绘 DrawView.this.allpoint.add(p);// 保存坐标点 dx = event.getX(); dy = event.getY(); dd = (event.getX() - dx) * (event.getY() - dy) * (event.getX() - dx) * (event.getY() - dy); currentTime = System.currentTimeMillis(); } else if (event.getAction() == MotionEvent.ACTION_MOVE) {// 用户移动 DrawView.this.allpoint.add(p);// 记录坐标点 DrawView.this.postInvalidate();// 重绘图形 dd = (event.getX() - dx) * (event.getY() - dy) * (event.getX() - dx) * (event.getY() - dy); } else if (event.getAction() == MotionEvent.ACTION_UP) {// 用户松开 DrawView.this.allpoint.add(p);// 记录坐标点 DrawView.this.postInvalidate();// 重绘图形 // 记录到历史记录 historyPoints.add(allpoint); long dt = System.currentTimeMillis() - currentTime; dd = (event.getX() - dx) * (event.getY() - dy) * (event.getX() - dx) * (event.getY() - dy); if (dd < 200 && dt >= 800) { // 若是移动距离在根号200px内,而且长按时间超过0.8秒,不记录该笔画 historyPoints.remove(historyPoints.size() - 1); } dd = 300; } return true; // 表示下面的操做不在执行了。 } } @Override protected void onDraw(Canvas canvas) { // 进行绘图 paint.setColor(color); paint.setStrokeWidth(paintWidth); // 画出历史记录 for (List<Point> points : historyPoints) { if (points.size() > 0)// 有坐标点保存的时候开始进行绘图 { Iterator<Point> iterator = points.iterator(); Point first = null; Point last = null; while (iterator.hasNext()) { if (first == null) { first = (Point) iterator.next();// 取出坐标 } else { if (last != null) {// 前一阶段已经完成 first = last;// 从新开始下一阶段 } last = (Point) iterator.next();// 结果点坐标 canvas.drawLine(first.x, first.y, last.x, last.y, paint); } } } } // 画出当前的线 if (DrawView.this.allpoint.size() > 0)// 有坐标点保存的时候开始进行绘图 { Iterator<Point> iterator = DrawView.this.allpoint.iterator(); Point first = null; Point last = null; while (iterator.hasNext()) { if (first == null) { first = (Point) iterator.next();// 取出坐标 } else { if (last != null) {// 前一阶段已经完成 first = last;// 从新开始下一阶段 } last = (Point) iterator.next();// 结果点坐标 canvas.drawLine(first.x, first.y, last.x, last.y, paint); } } } } /** * 撤销操做,能够移除画笔历史记录的最后一步 */ public void cancel() { if (historyPoints != null) { if (historyPoints.size() > 0) { historyPoints.remove(historyPoints.size() - 1); invalidate(); } } } /** 设置画笔颜色 */ public void setColor(int color) { this.color = color; } /** 设置画笔颜色 */ public void setColor(String color) { this.color = Color.parseColor(color); } /** 设置画笔粗细 */ public void setPaintWidth(int paintWidth) { this.paintWidth = paintWidth; } }
效果图:java