1

私は描画アプリを作成していますが、次のコードは正常に動作しますが、ペイントラインの色を変更したい場合は、以前に描画されたすべての線が新しい色に変更されます:

    private Bitmap bitmap; // drawing area for display or saving
    private Canvas bitmapCanvas; // used to draw on bitmap
    private Paint paintLine; // used to draw lines onto bitmap   
    private Path mPath; 
    private ArrayList<Path> paths = new ArrayList<Path>();
    private ArrayList<Path> undonePaths = new ArrayList<Path>();
    private float mX, mY;
    private static final float TOUCH_TOLERANCE = 4;    

    // DoodleView constructor initializes the DoodleView

    public DoodleView(Context context, AttributeSet attrs) 
    {
       super(context, attrs); // pass context to View's constructor
       this.context_new=context;
       setFocusable(true);
       setFocusableInTouchMode(true);      

       // set the initial display settings for the painted line
       paintLine = new Paint();
       paintLine.setAntiAlias(true); // smooth edges of drawn line
       paintLine.setDither(true);
       paintLine.setColor(Color.BLACK); // default color is black
       paintLine.setStyle(Paint.Style.STROKE); // solid line
       paintLine.setStrokeJoin(Paint.Join.ROUND);
       paintLine.setStrokeWidth(5); // set the default line width
       paintLine.setStrokeCap(Paint.Cap.ROUND); // rounded line ends

       bitmapCanvas = new Canvas();
       mPath = new Path();            
     } // end DoodleView constructor

     // Method onSizeChanged creates BitMap and Canvas after app displays

     @Override
     public void onSizeChanged(int w, int h, int oldW, int oldH)
     {
        super.onSizeChanged(w, h, oldW, oldH);
        DoodlzViewWidth = w;       
        DoodlzViewHeight = h;           
     } 

     @Override

     protected void onDraw(Canvas canvas) 
     {         
       for (Path p : paths){canvas.drawPath(p, paintLine);}  
       canvas.drawPath(mPath, paintLine);
       Log.i("OnDRAWING", "REACH ON DRAW");        
    } 

  // START TOUCH: handle touch event
     @Override

     public boolean onTouchEvent(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;
    }

     private void touch_start(float x, float y) 
     {
       undonePaths.clear();
       mPath.reset();
       mPath.moveTo(x, y);
       mX = x;
       mY = y;
    }

    private void touch_move(float x, float y) 
    {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);
        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);      
        bitmapCanvas.drawPath(mPath, paintLine);// commit the path to our offscreen  
        paths.add(mPath);
        mPath = new Path(); 
    }

    public void onClickUndo() 
    { 
       if (paths.size()>0) 
        { 
           undonePaths.add(paths.remove(paths.size()-1));
           invalidate();
        }      
       else Toast.makeText(getContext(), "nothing more to undo", Toast.LENGTH_SHORT).show();  
    }

setDrawingColor:

   public void setDrawingColor(int color) // set the painted line's color 
   {       
       paintLine.setColor(color);
   } 

前の行が元の色に固定されるように、上記のコードをどのように変更できますか??? ありがとう!!

4

3 に答える 3

1

パスの色を追跡し、onDraw最初にパスをペイントするために使用された色を復元する必要があります。

 protected void onDraw(Canvas canvas) 
 {          
   for (Path p : paths){canvas.drawPath(p, paintLine);}  
   paintLine.setColor(restoreColorForPath(p));
   canvas.drawPath(mPath, paintLine);
   Log.i("OnDRAWING", "REACH ON DRAW");        
} 

あなたはただ実装する必要がrestoreColorForPathあり、それはconter部分ですstoreColorForPath(path,color)(おそらく単純なものでMap

この同様の質問はあなたを助けることができます:異なる色で複数の線を描き、元に戻す方法、Androidでパスをやり直しますか?

于 2013-02-21T12:31:53.080 に答える
0
protected void onDraw(Canvas canvas) 
 {         
   for (Path p : paths){canvas.drawPath(p, paintLine);}  
   canvas.drawPath(mPath, paintLine);
   Log.i("OnDRAWING", "REACH ON DRAW");        
} 

上記の代わりにこのコードを試してください

protected void onDraw(Canvas canvas) 
 {         
   canvas.drawBitmap(bitmapCanvas, 0,0,paintLine);
   canvas.drawPath(mPath, paintLine);
   Log.i("OnDRAWING", "REACH ON DRAW");        
}
于 2013-02-21T12:36:45.263 に答える
0
@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    for (int i = 0; i < position1.size(); i += 2) {
        float x1 = position1.get(i);
        float y1 = position1.get(i + 1);
        float x2 = position2.get(i);
        float y2 = position2.get(i + 1);

        Paint paint = new Paint();
        if(words[a].getMEANING().equals(s2[b])){
            paint.setPathEffect(new CornerPathEffect(10));
            paint.setColor(Color.GREEN);
            paint.setStrokeWidth(13);
            paints.add(paint);
        }else{
            paint.setPathEffect(new CornerPathEffect(10));
            paint.setColor(Color.RED);
            paint.setStrokeWidth(13);
            paints.add(paint);

        }



        canvas.drawLine(x1,y1, x2,y2, paints.get(i));
    }
}
于 2019-10-22T13:28:07.070 に答える