2013-08-20 66 views
4

上午正在繪畫。當繪製線時,繪製完美。當我畫一條新線時,先前畫出的線從視圖中移除,我不知道它爲什麼會發生。任何人都知道請幫助我。手指畫線中的畫線刪除以前繪製的圖像

public class DrawView extends View implements OnTouchListener {// custom view 
       private Canvas mCanvas; 
       private Path mPath; 
     private ArrayList<Pair<Path, Paint>> paths = new ArrayList<Pair<Path, Paint>>(); 
    private ArrayList<Pair<Path, Paint>> undonePaths = new ArrayList<Pair<Path, Paint>>(); 


       public DrawView(Context context) { 
        super(context); 
        setFocusable(true); 
        setFocusableInTouchMode(true); 
        this.setOnTouchListener(this); 

        mCanvas = new Canvas(); 

        mPath = new Path(); 



       } 

       @Override 
       protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
        super.onSizeChanged(w, h, oldw, oldh);  //do as user want 

      } 

       @Override 
       protected void onDraw(Canvas canvas) { //onDraw method 


         //DRAWING LINE................................ 

         linearray[0]=stupx; 
         linearray[1]=stupy; 
         linearray[2]=upx; 
         linearray[3]=upy; 

         canvas.drawLines(linearray, mPaint); 


         Log.d("METHOD", "ONDRAW LINE FIRED "+stupx+" "+stupy+""+upx+" "+upy); 


       } 



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

       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 touchline() { 
        // TODO Auto-generated method stub 
        Log.d("METHOD", "TOUCHLINE FIRED "); 


        mPath.lineTo(mX, mY); 
        // commit the path to our offscreen 
       mCanvas.drawPath(mPath, mPaint); 
       // kill this so we don't double draw 



         newShapePaint = new Paint(mPaint); // Clones the mPaint object 
         paths.add(new Pair<Path, Paint>(mPath, newShapePaint)); 

         Log.d("TOUCH UP", "METHOD FIRED WITHOUT COLOR CHANGE"+_color); 


        mPath = new Path(); 
       } 

      } 

// onTouch事件

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

        upx=0f; 
        upy=0f; 

        switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         stupx=event.getX(); 
         stupy=event.getY(); 
         touch_start(x, y); 
         invalidate(); 
         break; 
        case MotionEvent.ACTION_MOVE: 
         touch_move(x, y); 
         invalidate(); 
         break; 
        case MotionEvent.ACTION_UP: 
         Log.d("method", "touch up fired"); 
         upx=event.getX(); 
         upy=event.getY(); 


         touchline(); //call after remove finger 


         invalidate(); 
         break; 
        } 
        return true; 
       } 

} 

回答

0

當你調用無效不帶任何參數,它完全無效屏幕(完全重繪屏幕矩形),從而刪除你前行。嘗試使用適當的參數調用invalidate。

請在下面找到fingerPaint的代碼。我拿apidemos :)(apidemos-graphics-fingerpaint):

/* 
* Copyright (C) 2007 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.example.android.apis.graphics; 

import android.content.Context; 
import android.graphics.*; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.MotionEvent; 
import android.view.View; 

public class FingerPaint extends GraphicsActivity 
     implements ColorPickerDialog.OnColorChangedListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new MyView(this)); 

     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(0xFFFF0000); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(12); 

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

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

    private Paint  mPaint; 
    private MaskFilter mEmboss; 
    private MaskFilter mBlur; 

    public void colorChanged(int color) { 
     mPaint.setColor(color); 
    } 

    public class MyView extends View { 

     private static final float MINP = 0.25f; 
     private static final float MAXP = 0.75f; 

     private Bitmap mBitmap; 
     private Canvas mCanvas; 
     private Path mPath; 
     private Paint mBitmapPaint; 

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

      mPath = new Path(); 
      mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
     } 

     @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.drawColor(0xFFAAAAAA); 

      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(); 

      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 static final int COLOR_MENU_ID = Menu.FIRST; 
    private static final int EMBOSS_MENU_ID = Menu.FIRST + 1; 
    private static final int BLUR_MENU_ID = Menu.FIRST + 2; 
    private static final int ERASE_MENU_ID = Menu.FIRST + 3; 
    private static final int SRCATOP_MENU_ID = Menu.FIRST + 4; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 

     menu.add(0, COLOR_MENU_ID, 0, "Color").setShortcut('3', 'c'); 
     menu.add(0, EMBOSS_MENU_ID, 0, "Emboss").setShortcut('4', 's'); 
     menu.add(0, BLUR_MENU_ID, 0, "Blur").setShortcut('5', 'z'); 
     menu.add(0, ERASE_MENU_ID, 0, "Erase").setShortcut('5', 'z'); 
     menu.add(0, SRCATOP_MENU_ID, 0, "SrcATop").setShortcut('5', 'z'); 

     /**** Is this the mechanism to extend with filter effects? 
     Intent intent = new Intent(null, getIntent().getData()); 
     intent.addCategory(Intent.CATEGORY_ALTERNATIVE); 
     menu.addIntentOptions(
           Menu.ALTERNATIVE, 0, 
           new ComponentName(this, NotesList.class), 
           null, intent, 0, null); 
     *****/ 
     return true; 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     mPaint.setXfermode(null); 
     mPaint.setAlpha(0xFF); 

     switch (item.getItemId()) { 
      case COLOR_MENU_ID: 
       new ColorPickerDialog(this, this, mPaint.getColor()).show(); 
       return true; 
      case EMBOSS_MENU_ID: 
       if (mPaint.getMaskFilter() != mEmboss) { 
        mPaint.setMaskFilter(mEmboss); 
       } else { 
        mPaint.setMaskFilter(null); 
       } 
       return true; 
      case BLUR_MENU_ID: 
       if (mPaint.getMaskFilter() != mBlur) { 
        mPaint.setMaskFilter(mBlur); 
       } else { 
        mPaint.setMaskFilter(null); 
       } 
       return true; 
      case ERASE_MENU_ID: 
       mPaint.setXfermode(new PorterDuffXfermode(
                 PorterDuff.Mode.CLEAR)); 
       return true; 
      case SRCATOP_MENU_ID: 
       mPaint.setXfermode(new PorterDuffXfermode(
                PorterDuff.Mode.SRC_ATOP)); 
       mPaint.setAlpha(0x80); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 
+0

謝謝你的回覆sushil。那只是在那裏掙扎,你能提供任何編碼來改變 – user2634966

+0

我編輯了我的答案,添加一個指紋代碼。希望這會幫助你。我從apidemos採取了這個代碼,它的工作:) – Sushil

+0

我已經嘗試過相同的演示Sushil。 – user2634966