Android在另一条路径上绘制路径

时间:2013-05-13 19:07:59

标签: android canvas drawing hashmap

所以我在绘图应用程序中遇到了这个奇怪的问题。

我从上到下,从左到右画了1到8行。

enter image description here

当我画线时,它显示为正在绘制所有其他线条的背后。每当我离开屏幕时,有时会弹出前面,这似乎是完全随机的。

我在任何时候都忽视了什么?

我的DrawView.java:

public class DrawView extends View implements OnTouchListener {

    private Path path = new Path();
    private Paint paint = new Paint();

    private Map<Path, Paint> pathMap = new HashMap<Path, Paint>();

    private boolean isScreenCleared = false;

    public DrawView(Context context) {
        super(context);
        this.setOnTouchListener(this);

        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);

    }

    @Override
    public void onDraw(Canvas canvas) {
        if (isScreenCleared) {
            pathMap.clear();
            canvas.drawColor(Color.WHITE);
            isScreenCleared = false;
        } else {
            //Current line
            canvas.drawPath(path, paint);

            //All other lines
            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:
            Paint newPaint = new Paint();
            newPaint.set(paint);
            pathMap.put(path, newPaint);
            break;
        default:
            return false;
        }

        invalidate();
        return true;
    }

    public float getRadius() {
        return paint.getStrokeWidth();
    }

    public void setRadius(float radius) {
        paint.setStrokeWidth(radius);
    }

    public void setColor(int color) {
        paint.setColor(color);
        System.out.println("Color set to: " + color);
    }

    public void clearScreen() {
        isScreenCleared = true;
        invalidate();
    }   
}

我在我的MainActivity中实例化DrawView,如下所示:

Relative layout = (RelativeLayout) findViewById(R.id.drawscreen);

DrawView dv = new DrawView(layout.getContext());

2 个答案:

答案 0 :(得分:0)

不要使用HashMap存储路径。使用Vector并添加新路径到最后。然后,当你绘制它们并迭代你的矢量时,你将以正确的顺序绘制它们,最近的顶部。

来自HashMap文档:

Note that the iteration order for HashMap is non-deterministic.

答案 1 :(得分:0)

好吧,我发现问题归功于Spartygw但发现了比Vector更好的东西。

有一个LinkedHashMap是确定性的。

因此使用它可以解决问题。

同时

它绘制了其他所有内容绘图是我的一个快速错误,因为我显然需要在整个(链接)HashMap之后绘制当前行