塗鴉自定義View

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

相關文章
相關標籤/搜索