這裏的問題是你只使用一個路徑。
您應該創建每個ACTION_DOWN了一條新路。對於這些路徑,您還必須存儲Paint。
例如,你可以定義兩個元素作爲成員的類:
public class Stroke {
private Path _path;
private Paint _paint;
}// add constructor(Path, Paint) and accessors
和中風在您的上下文列表:
List<Stroke> allStrokes = new ArrayList<Stroke>();
所以每ACTION_DOWN
,您創建一個新的Stroke (所以一個新的路徑,和一個新的油漆與您選擇的顏色)。
而且在每個ACTION_MOVE
上,您都檢索了最後一個添加的路徑,那麼您可以在lineTo
的最後一點。
然後在你的onDraw,只是提請所有生成的筆跡:
for (Stroke s : allStrokes) {
canvas.drawPath(s.getPath(), s.getPaint());
}
請注意,這個簡單的解決方案,你不能做一個多點觸控圖。爲此,您還必須存儲和處理MotionEvent ID。
編輯:下面是創建充滿隨機顏色筆觸工作的多點觸控漆例如:
DrawArea.java:
import android.content.Context;
import android.graphics.*;
import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class DrawArea extends View {
private List<Stroke> _allStrokes; //all strokes that need to be drawn
private SparseArray<Stroke> _activeStrokes; //use to retrieve the currently drawn strokes
private Random _rdmColor = new Random();
public DrawArea(Context context) {
super(context);
_allStrokes = new ArrayList<Stroke>();
_activeStrokes = new SparseArray<Stroke>();
setFocusable(true);
setFocusableInTouchMode(true);
setBackgroundColor(Color.WHITE);
}
public void onDraw(Canvas canvas) {
if (_allStrokes != null) {
for (Stroke stroke: _allStrokes) {
if (stroke != null) {
Path path = stroke.getPath();
Paint painter = stroke.getPaint();
if ((path != null) && (painter != null)) {
canvas.drawPath(path, painter);
}
}
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getActionMasked();
final int pointerCount = event.getPointerCount();
switch (action) {
case MotionEvent.ACTION_DOWN: {
pointDown((int)event.getX(), (int)event.getY(), event.getPointerId(0));
break;
}
case MotionEvent.ACTION_MOVE: {
for (int pc = 0; pc < pointerCount; pc++) {
pointMove((int) event.getX(pc), (int) event.getY(pc), event.getPointerId(pc));
}
break;
}
case MotionEvent.ACTION_POINTER_DOWN: {
for (int pc = 0; pc < pointerCount; pc++) {
pointDown((int)event.getX(pc), (int)event.getY(pc), event.getPointerId(pc));
}
break;
}
case MotionEvent.ACTION_UP: {
break;
}
case MotionEvent.ACTION_POINTER_UP: {
break;
}
}
invalidate();
return true;
}
private void pointDown(int x, int y, int id) {
//create a paint with random color
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10);
paint.setColor(_rdmColor.nextInt());
//create the Stroke
Point pt = new Point(x, y);
Stroke stroke = new Stroke(paint);
stroke.addPoint(pt);
_activeStrokes.put(id, stroke);
_allStrokes.add(stroke);
}
private void pointMove(int x, int y, int id) {
//retrieve the stroke and add new point to its path
Stroke stroke = _activeStrokes.get(id);
if (stroke != null) {
Point pt = new Point(x, y);
stroke.addPoint(pt);
}
}
}
Stroke.java:
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
public class Stroke {
private Path _path;
private Paint _paint;
public Stroke (Paint paint) {
_paint = paint;
}
public Path getPath() {
return _path;
}
public Paint getPaint() {
return _paint;
}
public void addPoint(Point pt) {
if (_path == null) {
_path = new Path();
_path.moveTo(pt.x, pt.y);
} else {
_path.lineTo(pt.x, pt.y);
}
}
}
MyActivity.java:
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DrawArea da = new DrawArea(this);
setContentView(da);
}
}
http://stackoverflow.com/questions/17781069/android-null-exception-on-calling-function/17781110#17781110。檢查這個編輯部分是否有幫助 – Raghunandan
謝謝你似乎是我在找什麼 – Katy