可能是因为我度过了漫长的一天而已经很晚了,但我似乎无法弄清楚我做错了什么。
我只是希望能够在每个线条的手指位置画线,以获得不同的宽度/颜色等。
每当触发ACTION_DOWN时,我都会创建一个新的Path
并继续将其附加到ACTION_MOVE。当ACTION_UP被触发时,我将当前的Path
和Paint
放在我的HashMap
中,从而保存Path
使用哪个Paint
,对吗?
当我从这个课程外面拨打setRadius(float radius)
时,我会调用paint.setStrokeWidth(radius)
,从而更改当前Paint
的笔画宽度。
但是出于某种原因,我每次拨打setStrokeWidth(radius)
所有我的Map.Entry的变化?从而使每个 Paint
的笔画宽度成为'新'笔画宽度,并使用新的笔画宽度重新绘制所有内容。
这可能非常明显,但我似乎无法找到错误。
这是我的DrawView.java。
package com.example.paintandprint;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class DrawView extends View implements OnTouchListener {
Path path = new Path();
Paint paint = new Paint();
Map<Path, Paint> pathMap = new HashMap<Path, Paint>();
public DrawView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawPath(path, paint);
for (Map.Entry<Path, Paint> p : pathMap.entrySet()) {
canvas.drawPath(p.getKey(), p.getValue());
}
}
public boolean onTouch(View view, MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path = new Path();
path.reset();
path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
break;
case MotionEvent.ACTION_UP:
pathMap.put(path, paint);
break;
default:
return false;
}
invalidate();
return true;
}
public float getRadius() {
return paint.getStrokeWidth();
}
public void setRadius(float radius) {
paint.setStrokeWidth(radius);
}
}
提前致谢!
答案 0 :(得分:3)
在这些方面:
case MotionEvent.ACTION_UP:
pathMap.put(path, paint);
break;
你在“油漆”中发送什么?它不是指向填充了预设值的结构的指针。是不是每个pathMap.put都发送指向相同数据的相同指针?这就是为什么如果你改变一次,你就到处改变它。
您需要为您创建的每个pathMap.put创建一个新的Paint,并将类的绘制的当前值复制到它。
case MotionEvent.ACTION_UP:
Paint newPaint = new Paint();
newPaint.set(paint); //copies the values over from the current class's paint
pathMap.put(path, newPaint);
break;