android更改更新路径,android – 更改路径颜色而不更改以前的路径

这里的问题是你只使用一个路径.

您应该在每个ACTION_DOWN上创建一个新路径.对于每个这些路径,您还必须存储Paint.

例如,您可以定义一个具有两个元素作为成员的类:

public class Stroke {

private Path _path;

private Paint _paint;

}// add constructor(Path, Paint) and accessors

以及上下文中的笔划列表:

List allStrokes = new ArrayList();

因此,在每个ACTION_DOWN上,您都会创建一个新的Stroke(所以一个新的Path,以及一个带有您选择颜色的新Paint).

在每个ACTION_MOVE上,您都可以检索最后添加的路径,然后您可以选择最后一个点.

然后在你的onDraw上,只绘制所有创建的Stroke:

for (Stroke s : allStrokes) {

canvas.drawPath(s.getPath(), s.getPaint());

}

请注意,使用此简单解决方案,您无法执行multiTouch绘图.为此,您还必须存储和处理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 _allStrokes; //all strokes that need to be drawn

private SparseArray _activeStrokes; //use to retrieve the currently drawn strokes

private Random _rdmColor = new Random();

public DrawArea(Context context) {

super(context);

_allStrokes = new ArrayList();

_activeStrokes = new SparseArray();

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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值