Android 筆記 SurfaceView實現塗鴉,軌跡重新繪製

實現塗鴉,點擊繪製,將塗鴉過程再繪製一次。
自定義SurfaceView

package com.bencoo.kme.view;

import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class DrawLine extends SurfaceView implements SurfaceHolder.Callback,Runnable {
    private float currentX;
    private float currentY;
    private Point currentPoint;
    private Path mPath;// 軌跡
    public List<Point> point = new ArrayList<Point>();//存儲每個軌跡點
    private int index;//點索引
    private SurfaceHolder holder;
    private Thread mThread;//線程
    /**
     * @description 畫筆
     * @date 2016-04-26
     */
    private Paint paint;

    public DrawLine(Context context) {
        super(context);
        init();
    }

    public DrawLine(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public DrawLine(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    /**
     * @description 初始化
     * @date 2016-04-27
     */
    private void init() {
        holder = getHolder();
        holder.addCallback(this);
        mPath = new Path();
        paint = new Paint();
        paint.setAntiAlias(true);// 去除鋸齒
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(5);// 筆寬
        paint.setColor(Color.BLUE);// 顏色
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        float stopX = event.getX();
        float stopY = event.getY();
        Point pointx = new Point((int) stopX, (int) stopY);
        switch (action) {

        case MotionEvent.ACTION_DOWN:// 按下
            mPath.reset();
            currentX = event.getX();
            currentY = event.getY();
            currentPoint = new Point((int) currentX, (int) currentY);
            mPath.moveTo(currentX, currentY);
            point.add(pointx);
            break;

        case MotionEvent.ACTION_MOVE:
            point.add(pointx);
            float sX = event.getX();
            float sY = event.getY();
            System.out.println(sX + "---" + sY);
            mPath.lineTo(sX, sY);
            Point p=new Point((int)sX, (int)sY);
            draw();
            break;
        case MotionEvent.ACTION_UP:
            point.add(pointx);
            break;
        }
        invalidate();
        return true;
    }


    public Path getPath() {
        return mPath;
    }

    public List<Point> getPoints() {
        return point;

    }

    public Point getCurrentPoint() {
        return currentPoint;

    }

    /**
     * @description 清除
     * @date 2016-04-26
     */
    public void clear() {
        mPath.reset();// 去除路徑
        invalidate();// 刷新
    }
    /**
     * @descriptionb 開始繪製
     * @date 
     */
    public void start() {
        mThread=new Thread(this);
        mThread.start();
    }
    /**
     * @descriptionb 停止線程
     * @date 
     */
    public void stop(){
        if(mThread!=null){
            mThread.interrupt();
            try {
                mThread.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
    /**
     * @descriptionb 繪製方法
     * @date 
     */
    private void draw() {
        Canvas canvas = holder.lockCanvas();
        Paint pa = new Paint();
        pa.setAntiAlias(true);
        pa.setColor(Color.RED);
        pa.setStyle(Paint.Style.STROKE);
        pa.setStrokeWidth(5);
        canvas.drawColor(Color.WHITE);
        canvas.drawPath(mPath, pa);
        System.out.println("畫" + index);
        // 解鎖畫布
        getHolder().unlockCanvasAndPost(canvas);

    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        Canvas canvas=holder.lockCanvas();
        canvas.drawColor(Color.WHITE);
        holder.unlockCanvasAndPost(canvas);
    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        if(mThread!=null){
            mThread.interrupt();
            try {
                mThread.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
    /**
     * @description 重繪軌跡
     */
    @Override
    public void run() {
        Canvas canvas=null;
        Path path=new Path();
        path.moveTo(currentX, currentY);
        while (index<point.size()) {
            Point p=point.get(index);
            canvas=holder.lockCanvas();
            canvas.drawColor(Color.WHITE);
            path.lineTo(p.x, p.y);
            canvas.drawPath(path, paint);
            index++;
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            holder.unlockCanvasAndPost(canvas);
        }

    }

}

Activity代碼

package com.bencoo.kme.activity;

import com.bencoo.kme.R;
import com.bencoo.kme.view.DrawLine;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class TestActivity extends Activity{
    private Button play;
    private DrawLine drawline;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        init();
    }
    private void init(){
        play=(Button) this.findViewById(R.id.bt_play);
        drawline=(DrawLine) this.findViewById(R.id.drawline);
        play.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                drawline.start();//啓動重繪線程
            }
        });
    }
}

佈局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <Button 
        android:id="@+id/bt_play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="繪製"/>
    <com.bencoo.kme.view.DrawLine 
        android:id="@+id/drawline"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章