2013-07-18 27 views
1

我想在画布上用多种颜色绘制,初始颜色效果很好,但是当它切换到另一种颜色时,以前一种颜色绘制线条,但后续线条绘制的颜色正确。即一次,如果我从绿色切换到黑色,我画的下一行是绿色的,然后是黑色。任何帮助表示赞赏。在画布上绘制的多种颜色

public class DrawingPanel extends View implements OnTouchListener { 
    private static final String TAG = "DrawView"; 
    private static final float MINP = 0.25f; 
    private static final float MAXP = 0.75f; 
    private Canvas mCanvas; 
    private Path mPath; 
    private Paint mPaint; 
    private Paint bmPaint; 
    private Paint gmPaint; 
    private ArrayList<Path> paths = new ArrayList<Path>(); 
    private Map<Path, Integer> colorsMap = new HashMap<Path,Integer>(); 
    private int selectedcolor; 
    SharedPreferences settings= getSharedPreferences("Macaroni",0); 
    private String selColr = settings.getString("DrawColor", ""); 

    public DrawingPanel(Context context) { 
     super(context); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 

     this.setOnTouchListener(this); 

     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(Color.BLACK); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(6); 
     mCanvas = new Canvas(); 

     mPath = new Path(); 
     paths.add(mPath); 
     colorsMap.put(mPath,getColorSel()); 

    }    
     @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
      super.onSizeChanged(w, h, oldw, oldh); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      for (Path p : paths){ 

       int grabColorFromHash =colorsMap.get(p);  
       mPaint.setColor(grabColorFromHash); 
       canvas.drawPath(p, mPaint); 
     } 
     } 

    private float mX, mY; 
     private static final float TOUCH_TOLERANCE = 4; 
     private void touch_start(float x, float y) { 

      mPath.reset(); 
      mPath.moveTo(x, y); 
      mX = x; 
      mY = y; 
      Log.i("touch_start","touch_start"); 
      } 

    private void touch_move(float x, float y) { 
      float dx = Math.abs(x - mX); 
      float dy = Math.abs(y - mY); 
      Log.i("touch_move","touch_move"); 

      if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
       mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
       mX = x; 
       mY = y; 
      } 
     } 

     private void touch_up() { 
      mPath.lineTo(mX, mY); 
      mPath = new Path(); 
      paths.add(mPath); 
      colorsMap.put(mPath,getColorSel()); 
      mPaint.setColor(getColorSel()); 

     } 
    public int getColorSel() 
    { 

      selColr = settings.getString("DrawColor", ""); 

     if (selColr.equalsIgnoreCase("Black")){ 
      mPaint.setColor(Color.BLACK); 
      selectedcolor = mPaint.getColor(); 
      } 

      if (selColr.equalsIgnoreCase("Red")) 
      { 
      mPaint.setColor(Color.RED); 
      selectedcolor = mPaint.getColor(); 
      } 

      if (selColr.equalsIgnoreCase("Green")) 
      { 
      mPaint.setColor(Color.GREEN); 
      selectedcolor = mPaint.getColor(); 
      } 

     return selectedcolor; 

    } 
    @Override 
    public boolean onTouch(View arg0, MotionEvent event) { 
      float x = event.getX(); 
      float y = event.getY(); 

      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        touch_start(x, y); 
        invalidate(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        touch_move(x, y); 
        invalidate(); 
        break; 
       case MotionEvent.ACTION_UP: 
        touch_up(); 
        invalidate(); 
        break; 
      } 
      return true; 
    } 
} 
+0

你能打印colorsMap的内容吗?我想你有重复的信息 –

+0

你可以在选择时显示存储颜色的代码吗?我认为有一个问题可能是因为你在getColorSel()函数中设置了mPaint.setColor()(因为你在'touch_up()'的最后一行调用了mPaint.setColor(),所以没有必要。我怀疑你 – spartygw

+0

所有我正在做的存储颜色是添加我想要的分享的颜色 – cmhdev

回答

1

在你touch_start您重置路径,但你不把它添加到ArrayList,直到touch_up所以我不明白它是如何得到绘制在所有当你在周围拖动手指的动作。

您的onDraw仅在通过ArrayList迭代时绘制路径。换句话说,向onDraw添加一些代码,以便将mPath和已经保存在ArrayList中的所有代码一起绘制。

很难说如果不能在调试器中运行你的东西,但我认为这可能会解决你的问题。

+0

谢谢spartygw我会给你一个尝试 – cmhdev

+0

我加了你的建议,它马上就起作用了......哥们儿让我发送一些积极的业力吧......谢谢。 – cmhdev

+0

真棒,男人。感谢您发布后续内容,在事情发生的时候总是很好听。 – spartygw