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