2012-11-19 48 views
3

對不起,如果問題很傻,但我是Android新手。我在developer.android.сom上閱讀了很多,但不幸的是我找不到解決方案。 我在staсkoverflow上找到的大部分代碼完成了零件本身。 此視圖插入到FrameLayout中的活動中,放在文本上,並允許您在電子書中留下注釋。在Paint和Canvas上更改顏色Android

import java.util.ArrayList; 

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 PaintSurface extends View implements OnTouchListener { 

    private Canvas canvas; 
    private Path path; 
    private Paint paint; 
    private ArrayList<Path> paths = new ArrayList<Path>(); 

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

     this.setOnTouchListener(this); 

     paint = new Paint(); 
     paint.setAntiAlias(true); 
     paint.setDither(true); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeJoin(Paint.Join.MITER); 
     paint.setStrokeCap(Paint.Cap.SQUARE); 
     paint.setColor(Color.RED); 
     paint.setStrokeWidth(16); 
     paint.setAlpha(100); 
     canvas = new Canvas(); 
     path = new Path(); 
     paths.add(path); 

    } 

    @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) { 
      canvas.drawPath(p, paint); 
     } 

    } 

    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     path.reset(); 
     path.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) { 
      path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 

    } 

    private void touch_up() { 
     path.lineTo(mX, mY); 
     canvas.drawPath(path, paint); 

     path = new Path(); 
     paths.add(path); 

    } 

    @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; 

    } 

    public void setColor(int color) { 
     paint.setColor(color); 

    } 
} 

說明問題。 我畫了默認顏色的線,紅色。然後,使用setColor()更改爲綠色在紅線旁邊畫一條綠線。但第一條紅線也變綠了。如果更改樣式或筆觸寬度,則會發生此類更改。 如何繪製不同的顏色?

一種感覺,在幾個月內這個問題似乎我可笑和愚蠢,我自己會覺得自己很傻,我會感到羞恥,但現在我不知道如何解決這個問題?

回答

2

一件事,你可以嘗試是創建一個Paint對象的數組列表中的每個路徑..這樣你可以在ArrayList中的每個路徑指定不同的Paint屬性...

4

Paint顏色纔會生效,當你畫。

從您的代碼中,您一次繪製所有路徑。

for (Path p : paths) { 
     canvas.drawPath(p, paint); 
    } 

這需要相同噴漆的對象,並用它來繪製的路徑,用什麼都顏色最後一組。

你需要做的是設置圖形之間的顏色。

paint.setColor(color.RED); // Will apply to first path. 

    for (Path p : paths) {   
     canvas.drawPath(p, paint); 
     paint.setColor(color.GREEN); // Will be applied on next Path. 
    } 

一個更好的解決辦法是

for (Path p : paths) {  
     //Determine Paint color Here. 
     paint.setColor(myColor); // where myColor is your variable to use for this layer. 
           // This could be from an array/List of colors matching to Paths. 
     canvas.drawPath(p, paint);   
    } 
+0

我該如何使用它來解決我的問題? http://stackoverflow.com/questions/18521661/change-color-without-affecting-anything-previously-drawn – Si8

0

您描述正確的方式,但是當第一次選擇的顏色,然後將它正常工作,但再次發生變化,然後發生同樣的問題。

0

更換你的onTouchEvent和方法的onDraw或者您可以使用該自定義視圖

package com.draw; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.PorterDuff.Mode; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

public class DrawingView extends View { 
    private Paint paint; 
    private Path path; 
    private Paint canvasPaint; 
    private Canvas drawCanvas; 
    private Bitmap canvasBitmap; 

    public DrawingView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.init(); 

     this.paint.setAntiAlias(true); 
     this.paint.setStrokeWidth(4f); 
     this.paint.setColor(Color.BLACK); 
     this.paint.setStyle(Paint.Style.STROKE); 
     this.paint.setStrokeJoin(Paint.Join.ROUND); 
    } 

    private void init() { 
     this.paint = new Paint(); 
     this.path = new Path(); 
     this.canvasPaint = new Paint(Paint.DITHER_FLAG); 
    } 

    public void setStroke(float width) { 
     this.paint.setStrokeWidth(width); 
    } 

    public void setColor(int color) { 
     this.paint.setColor(color); 
    } 

    public void reset() { 
     this.drawCanvas.drawColor(0, Mode.CLEAR); 
     invalidate(); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     this.canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     this.drawCanvas = new Canvas(this.canvasBitmap); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawBitmap(this.canvasBitmap, 0, 0, this.canvasPaint); 
     canvas.drawPath(this.path, this.paint); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float eventX = event.getX(); 
     float eventY = event.getY(); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      this.path.moveTo(eventX, eventY); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      this.path.lineTo(eventX, eventY); 
      break; 

     case MotionEvent.ACTION_UP: 
      this.drawCanvas.drawPath(this.path, this.paint); 
      this.path.reset(); 
      break; 

     default: 
      return false; 
     } 

     invalidate(); 
     return true; 
    } 
} 
1

試試這個代碼,這將有助於改變畫布背景顏色和油漆color.I我在我的應用程序使用此。

package com.kidsfingerpainting; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.PorterDuff.Mode; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

public class CanvasView extends View { 

    private Paint mPaint; 

    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private android.graphics.Path mPath; 
    private Paint mBitmapPaint; 
    private ArrayList<Path> paths = new ArrayList<Path>(); 
    private ArrayList<Path> undonePaths = new ArrayList<Path>(); 
    public static int selectedcolor; 
    private Map<Path, Integer> colorsMap = new HashMap<Path, Integer>(); 

    public CanvasView(Context c, int width, int height) { 
     super(c); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(0xFF000000); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(10); 
     mCanvas = new Canvas(); 
     mPath = new Path(); 
     mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
     selectedcolor = getResources().getColor(R.color.black); 

    } 

    public CanvasView(Context context, AttributeSet arr) { 
     super(context, arr); 

    } 

    // ////////////////////////all color for brush///////////////// 
    public void setPaintMode() { 
     mPaint.setColor(0xFF000000); 
     mPaint.setStrokeWidth(10); 
    } 

    public void set_PaintModetrans() { 
     mPaint.setColor(0x00000000); 
     mPaint.setStrokeWidth(10); 
    } 

    public void setPaintMode_violet() { 
     mPaint.setColor(0xFF8B00FF); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.violet); 
    } 

    public void setPaintMode_indigo() { 
     mPaint.setColor(0xFF000066); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.indigo); 
    } 

    public void setPaintMode_blue() { 
     mPaint.setColor(0xFF0000FF); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.blue); 
    } 

    public void setPaintMode_green() { 
     mPaint.setColor(0xFF00FF00); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.green); 
    } 

    public void setPaintMode_yellow() { 
     mPaint.setColor(0xFFFFFF00); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.yellow); 
    } 

    public void setPaintMode_orange() { 
     mPaint.setColor(0xFFFF7F00); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.orange); 
    } 

    public void setPaintMode_red() { 
     mPaint.setColor(0xFFFF0000); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.red); 
    } 

    public void setPaintMode_redbg() { 
     mCanvas.drawColor(0xFFFF0000); 
     mPaint.setColor(0x00000000); 
    } 

    public void setPaintMode_pink() { 
     mPaint.setColor(0xFFFF33CC); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.pink); 
    } 

    public void setPaintMode_white() { 
     mPaint.setColor(0xFFFFFFFF); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.white); 
    } 

    public void setPaintMode_black() { 
     mPaint.setColor(0xFF000000); 
     mPaint.setStrokeWidth(10); 
     selectedcolor = getResources().getColor(R.color.black); 
    } 

    // /////////////////////// all background color set code//////////// 
    public void setPaintMode_blackbg() { 
     mCanvas.drawColor(0xFF000000); 
    } 

    public void setPaintMode_whitebg() { 
     mCanvas.drawColor(0xFFFFFFFF); 
    } 

    public void setPaintMode_pinkbg() { 
     mCanvas.drawColor(0xFFFF33CC); 
    } 

    public void setPaintMode_orangebg() { 
     mCanvas.drawColor(0xFFFF7F00); 
    } 

    public void setPaintMode_yellowbg() { 
     mCanvas.drawColor(0xFFFFFF00); 
    } 

    public void setPaintMode_greenbg() { 
     mCanvas.drawColor(0xFF00FF00); 
    } 

    public void setPaintMode_bluebg() { 
     mCanvas.drawColor(0xFF0000FF); 

    } 

    public void setPaintMode_indigobg() { 
     mCanvas.drawColor(0xFF000066); 

    } 

    public void setPaintMode_violetbg() { 
     mCanvas.drawColor(0xFF8B00FF); 

    } 

    // //////////////////////////////////////////////////// 
    public void setEraseMode() { 
     selectedcolor = getResources().getColor(R.color.white); 
     mPaint.setColor(0xFFFFFFFF); 
     mPaint.setStrokeWidth(10); 
    } 

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

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     for (Path p : paths) { 
      mPaint.setColor(colorsMap.get(p)); 
      canvas.drawPath(p, mPaint); 
     } 

     mPaint.setColor(selectedcolor); 
     canvas.drawPath(mPath, mPaint); 
    } 

    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 8; 

    private void touch_start(float x, float y) { 
     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); 
     paths.add(mPath); 
     colorsMap.put(mPath, selectedcolor); 
     mPath = new Path(); 
     mPath.reset(); 
     invalidate(); 

    } 

    public void eraseAll() { 

     if (mPath != null) { 
      paths.clear(); 
     } 
     invalidate(); 
    } 

    @SuppressLint("ClickableViewAccessibility") 
    @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); 
      // currentMoveList.add(mPath); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(); 

      invalidate(); 
      break; 
     } 
     return true; 
    } 

    public void resetcanvas() { 
     mCanvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); 
    } 

    public void onClickUndo() { 
     if (paths.size() > 0) { 
      undonePaths.add(paths.remove(paths.size() - 1)); 
      invalidate(); 
     } else { 

     } 

    } 
} 

你可以調用它通過這樣做,從活動的任何方法。

CanvasView canvas = new CanvasView(MainActivity.this, width, height); 
     frame_layout.addView(canvas); 

在onCreate方法粘貼此。

//設置的onclick監聽器,並使用以下代碼

undo = (ImageView) findViewById(R.id.undo); 
     undo.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       canvas.onClickUndo(); 

      } 
     }); 
     eraser = (ImageView) findViewById(R.id.eraser); 
     eraser.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       canvas.setEraseMode(); 

      } 
     }); 
     clear = (ImageView) findViewById(R.id.clear); 
     clear.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       canvas.eraseAll(); 

      } 
     }); 
1

我有同樣的問題,我有我的DrawingView類兩種方法,一種改變顏色當在調色板中選擇一種不同的顏色。另一種是每隔幾秒鐘用一個處理程序隨機更改顏色。

我必須在兩種方法中使用invalidate()來刷新主線程上受影響的內容,而不是更改以前繪製的內容。如果你只是在你的方法中使用invalidate,那麼效果很好。

public void setColor(String newColor) { 
    //set color 
    invalidate(); 
    paintColor = Color.parseColor(newColor); 
    drawPaint.setColor(paintColor); 
} 


//random color chosen automatically 
public void randomColor() { 
    //invalidate needed here for the random color change every 30sec, to not change lines already drawn. 
    invalidate(); 
    paintColor = Color.argb(255, rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); 
    drawPaint.setColor(paintColor); 
} 
相關問題