實現塗鴉,點擊繪製,將塗鴉過程再繪製一次。
自定義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>