2013-05-08 45 views
1

这可能是因为我有一个漫长的一天,已经很晚了,但我似乎无法弄清楚我做错了什么。绘制多条线并记住它们的厚度

我只是希望能够吸引我的手指的位置行,每行有不同的宽度/颜色等

每当ACTION_DOWN,都会激发我创建了一个新的Path,并保持在ACTION_MOVE其追加。当ACTION_UP被触发时,我把当前的PathPaint放在我的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); 
    } 
} 

在此先感谢!

回答

3

在这些线路:

case MotionEvent.ACTION_UP: 
    pathMap.put(path, paint); 
    break; 

你在发送中的 “油漆” ???它不是指向充满预设值的结构的指针吗?是不是每个pathMap.put都发送指向相同数据的相同指针?这就是为什么如果你改变一次,你改变它到处。

您需要为每个您制作的pathMap.put创建一个新的Paint,并将类的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; 
+0

哦,上帝,当然。谢谢!这解决了这个问题。 – James 2013-05-09 09:06:14

+0

非常感谢这一点 - 我花了很多年试图找出如何改变Paint对象的宽度。 – 2014-10-29 11:39:04