2013-02-06 2 views
0

다음은 제 코드입니다. 선을 그릴 수 있지만 재실행 및 실행 취소 버튼이 작동하지 않습니다. 누구든지 도와 주실 수 있습니다.Android : 실행 취소, 다시 실행 작업이 작동하지 않습니다.

다음은 내 활동입니다. 실행 취소 및 다시 실행 방법을 확인하십시오.

public class Paint_main extends Activity implements OnTouchListener { 

    static Paint p1; 
    static Paint p2; 
    ImageView img; 
    Bitmap bm; 
    Float startx; 
    Float starty; 
    Float endx; 
    Float endy; 
    Button b1; 
    EditText et; 
    File file; 
    File myDir; 
    private static ToggleButton toggleButton; 
    private Canvas mCanvas; 
    private Path mPath; 

    private ArrayList<Path> paths = new ArrayList<Path>(); 
    private ArrayList<Path> undonePaths = new ArrayList<Path>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button btn_undo = (Button) findViewById(R.id.undoButton); 

     btn_undo.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { onClickUndo(); } 
     }); 

     Button btn_redo = (Button) findViewById(R.id.redoButton); 

     btn_redo.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { onClickRedo(); } 
     }); 

     bm = Bitmap.createBitmap(getWindowManager().getDefaultDisplay().getWidth(), 
           getWindowManager().getDefaultDisplay().getHeight(), 
           Bitmap.Config.ARGB_8888); 

     img = (ImageView) findViewById(R.id.imageView1);  
     img.setImageBitmap(bm); 

     p1 = new Paint(); 
     p1.setAntiAlias(true); 
     p1.setDither(true); 
     p1.setStyle(Paint.Style.STROKE); 
     p1.setStrokeJoin(Paint.Join.ROUND); 
     p1.setStrokeCap(Paint.Cap.ROUND); 
     p1.setColor(Color.GREEN); 
     p1.setStrokeWidth(6); 
     mCanvas = new Canvas(bm); 
     mPath = new Path(); 
     // paths.add(mPath); 
     img.setOnTouchListener(this); 
    } 

    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, p1); 
     // kill this so we don't double draw    
     // mPath = new Path(); 
     // paths.add(mPath); 
     paths.add(mPath); 
     mPath = new Path(); 
    } 

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

    public void onClickRedo(){ 
     if (undonePaths.size() > 0) { 
      paths.add(undonePaths.remove(undonePaths.size()-1)); 
      img.invalidate(); 
      onDraw(mCanvas); 
     } 
    } 


    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); 
       img.invalidate(); 
       onDraw(mCanvas); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       touch_move(x, y); 
       img.invalidate(); 
       onDraw(mCanvas); 
       break; 
      case MotionEvent.ACTION_UP: 
       touch_up(); 
       img.invalidate(); 
       onDraw(mCanvas); 
       break; 
     } 
     return true; 
    } 

    protected void onDraw(Canvas canvas) { 
     //mPath = new Path(); 
     //canvas.drawPath(mPath, mPaint); 

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

위의 onDraw 메소드를 잘못 호출 할 수 있습니다.

+0

전혀 확인하지 않거나 다시 그리지 않습니까? – neworld

+0

다시 실행 취소 기능이 제대로 작동하지 않습니다. –

+0

m 답을 기다리는 중 ..... –

답변

0

알겠습니다. 문제 : img.setOnTouchListener(this);이 이벤트를 가져 와서 처리하고 true를 반환합니다. 이는이 이벤트가 handlet임을 의미합니다. 사용자의 터치 이미지 return true, 그렇지 않으면 false를 반환 3) 자신의 클래스를 작성하고 있는지 확인할 수

1) 부모보기로 onTouchListener을 설정하고 수동) 2 차일하는 터치 이벤트를 보낼 :

당신은 3 가지 옵션이 있습니다 대체 onTouchEvent(..) 방법

나는 3 가지 옵션을 권장합니다. 나는 당신을 위해 재 작성 :

package com.example.paint_main; 

import java.io.File; 
import java.util.ArrayList; 

import android.app.Activity; 
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.os.Bundle; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnTouchListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.ToggleButton; 

public class Paint_main extends Activity { 

    MyImageView img; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_paint_main); 

     img = (MyImageView) findViewById(R.id.imageView1); 
     img.init(getWindowManager().getDefaultDisplay().getWidth(), getWindowManager().getDefaultDisplay().getHeight()); 

     Button btn_undo = (Button) findViewById(R.id.undoButton); 

     btn_undo.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { img.onClickUndo(); } 
     }); 

     Button btn_redo = (Button) findViewById(R.id.redoButton); 

     btn_redo.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { img.onClickRedo(); } 
     }); 
    } 

    static class MyImageView extends ImageView { 

     static Paint p1; 
     static Paint p2; 
     Bitmap bm = null; 
     Float startx; 
     Float starty; 
     Float endx; 
     Float endy; 
     Button b1; 
     EditText et; 
     File file; 
     File myDir; 
     private static ToggleButton toggleButton; 
     private Canvas mCanvas; 
     private Path mPath; 

     private ArrayList<Path> paths = new ArrayList<Path>(); 
     private ArrayList<Path> undonePaths = new ArrayList<Path>(); 

     static { 
      p1 = new Paint(); 
      p1.setAntiAlias(true); 
      p1.setDither(true); 
      p1.setStyle(Paint.Style.STROKE); 
      p1.setStrokeJoin(Paint.Join.ROUND); 
      p1.setStrokeCap(Paint.Cap.ROUND); 
      p1.setColor(Color.GREEN); 
      p1.setStrokeWidth(6); 
     } 

     public MyImageView(Context context, AttributeSet attrs, int defStyle) { 
      super(context, attrs, defStyle); 
     } 

     public MyImageView(Context context, AttributeSet attrs) { 
      super(context, attrs); 
     } 

     public MyImageView(Context context) { 
      super(context); 
     } 

     public void init(int width, int height) { 
      bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
      mCanvas = new Canvas(bm); 
      mPath = new Path(); 
     } 

     @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); 
        this.invalidate(); 
        onDraw(mCanvas); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        touch_move(x, y); 
        this.invalidate(); 
        onDraw(mCanvas); 
        break; 
       case MotionEvent.ACTION_UP: 
        touch_up(); 
        this.invalidate(); 
        onDraw(mCanvas); 
        break; 
      } 
      return true; 
     } 

     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, p1); 
      // kill this so we don't double draw    
      // mPath = new Path(); 
      // paths.add(mPath); 
      paths.add(mPath); 
      mPath = new Path(); 
     } 

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

     public void onClickRedo(){ 
      if (undonePaths.size() > 0) { 
       paths.add(undonePaths.remove(undonePaths.size()-1)); 
       invalidate(); 
       onDraw(mCanvas); 
      } 
     } 

     protected void onDraw(Canvas canvas) { 
      //mPath = new Path(); 
      //canvas.drawPath(mPath, mPaint); 

      if (bm == null) 
       return; 

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

레이아웃으로 클래스를 추가 잊지 마세요 : 당신이 어떤 특정 이미지 뷰 기능을 사용하지 않기 때문에

<view class="com.example.paint_main.Paint_main$MyImageView" 
    android:id="@+id/imageView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/redoButton" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" /> 

또한, 대신 이미지 뷰의보기를 사용해야합니다. 세 번째 옵션에서 의미하는 바를 더 쉽게 이해하기 위해 ImageView로 다시 작성합니다.

+0

"전체 도면을 지우는 방법" –

+0

과 관련된 또 다른 질문은'paths.clear();'및 게시물 무효화. – neworld

+0

http://stackoverflow.com/questions/14761355/i-dont-know-how-to-clear-the-drawing-on-canvas –

관련 문제