0

我在寫一個EditText的子類,允許用戶用他的手指在上面繪製。爲此,我創建了一個名爲drawing的布爾值,如果它是真的,則將EditText放在繪圖模式下,並且鍵盤不會打開,如果該值爲false,則允許用戶打開鍵盤並在保留繪圖時使用它來處理繪圖模式。在EditText上覆蓋onDraw

該繪圖的代碼基於Google Android示例,名爲FingerPaint。在這個意圖將其實現到EditText之前,代碼是在視圖的子類上實現的,並且工作得很完美,但問題是在佈局中組合EditText和該視圖會降低性能,這是非常糟糕的。

有很多代碼可以做到這一點,因爲可以用來實現兩個不同的掩碼過濾器,這些過濾器添加了一些行到這個代碼中,這個類沒有在本地使用。

我的問題是,當我重寫onDraw(),並且繪圖爲false時,文本不會顯示給用戶,但會顯示鍵盤和寫入行(|)。

這裏我的代碼:

import android.content.Context; 
import android.graphics.*; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.EditText; 

public class DrawEditText extends EditText { 

    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    private Paint mBitmapPaint; 
    private Paint mPaint; 
    private MaskFilter mEmboss; 
    private MaskFilter mBlur; 

    private Boolean drawing; 

    public DrawEditText(Context c) { 
     super(c); 


     //This initializes all the objects 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

     mPaint = new Paint(); 
     mPaint.setColor(Color.BLACK); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeWidth(5); 
     mPaint.setAntiAlias(true); 

     mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 
       0.4f, 6, 3.5f); 

     mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); 

     drawing = true; 
    } 
    public DrawEditText(Context c, AttributeSet attrs) { 
     super(c, attrs); 

     //This initializes all the objects 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

     mPaint = new Paint(); 
     mPaint.setColor(Color.BLACK); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeWidth(5); 
     mPaint.setAntiAlias(true); 

     mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 
       0.4f, 6, 3.5f); 

     mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); 

     drawing = true; 
    } 

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

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, 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; 
    } 
    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); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 

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

     //This conditional makes that if not it's drawing no points are saved and no points are drawed 
     if (drawing){ 
      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; 
     } else { 
      return super.onTouchEvent(event); 
     } 
    } 

    public void changePaint(int stroke, int color){ 
     mPaint.setColor(color); 
     mPaint.setStrokeWidth(stroke); 
    } 
    public void clear(){ 
     mCanvas.drawColor(0x00AAAAAA); 
     mCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 
    } 
    public void changeBrush(int id){ 
     //String[] ids={"emboss", "blur", "another"}; 
     switch (id) { 
     case 0: 
      mPaint.setMaskFilter(mEmboss); 
      break; 
     case 1: 
      mPaint.setMaskFilter(mBlur);     
      break; 
     case 2: 
      mPaint.setMaskFilter(null);   
      break; 
     default: 
      mPaint.setMaskFilter(null); 
      break; 
     } 
    } 
    public void eraser(){ 
     mPaint.setMaskFilter(null); 
     mPaint.setColor(0x00AAAAAA); 
    } 

    public void setDrawing(Boolean drawing){ 
     this.drawing = drawing; 
    } 

    public Boolean isDrawing(){ 
     return drawing; 
    } 
} 

回答

1

只要給的EditText有機會得出自己的內容:

@Override 
protected void onDraw(Canvas canvas) { 
    if(drawing) { 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, mPaint); 
    } else { 
     super.onDraw(canvas); 
    } 
} 
+0

它解決了我的問題,但我要的是表現出兩個東西,文字並繪製所有的時間,所以我刪除了條件,然後它按照我的意圖工作。 –