Как выполнить операцию отмены в красках на Android - PullRequest
0 голосов
/ 21 февраля 2012

Привет, мне нужно выполнить операцию отмены в красках. Кто-то предлагает использовать шаблон команды, но я не получаю шаблон команды. Там есть какое-то решение. помогите мне как отменить. Я рисую краски, используя приведенный ниже код.

         BookType3.class:
                 public class BookType3 extends Activity implements OnClickListener{
          MyView  myview;
        int counter=0;
      private Paint   mBitmapPaint;
           TextView t1,t2;
           private Bitmap  mBitmap;
    public static boolean action=false;
       Button back,erase,undo,save,home;
      int image1,image2,image3;
         private Canvas  mCanvas;
         RelativeLayout relative;
                RelativeLayout.LayoutParams lp6,lp7;
                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                requestWindowFeature(Window.FEATURE_NO_TITLE);
                 setContentView(R.layout.booktype1);
          List<String> names = Arrays.asList("a","b","c");
              relative=(RelativeLayout)findViewById(R.id.relative3);
               myview = new MyView(this);
                  myview.setId(004);
              lp6 = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT,          RelativeLayout.LayoutParams.WRAP_CONTENT);
              myview.setLayoutParams(lp6);
             myview.setBackgroundResource(R.drawable.writingsapce);
              undo=(Button)findViewById(R.id.undobutton);
              undo.setOnClickListener(this);
                    mPaint = new Paint();
                   mPaint.setAntiAlias(true);
                 mPaint.setDither(true);
          mPaint.setColor(Color.BLACK);
          mPaint.setStyle(Paint.Style.STROKE);
              mPaint.setStrokeJoin(Paint.Join.ROUND);
           mPaint.setStrokeCap(Paint.Cap.ROUND);
               mPaint.setStrokeWidth(4);
             String s1="";
         t1=(TextView)findViewById(R.id.button1);
       t1.setOnClickListener(this);        
       t2=(TextView)findViewById(R.id.button2);
       t2.setOnClickListener(this);
           relative.addView(myview,lp6);
         }
           private Paint       mPaint;
            public class MyView extends View{
    private Path    mPath;
       public MyView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
         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.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
                        canvas.drawPath(mPath, mPaint); 
                         if(action)
                              {
                        invalidate();

                          }
                          }

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

        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) {
            int x = (int) event.getX();
            int y = (int) event.getY();
            Log.i("x",""+event.getX());
            Log.i("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 onClick(View v) {
// TODO Auto-generated method stub
if(v==t1)
{
     mPaint.setColor(Color.RED);
    t30.setText("A");
    t31.setText("a");
    t32.setText("Aa");
    t30.setTextColor(Color.RED);
    t31.setTextColor(Color.RED);
    t32.setTextColor(Color.RED);
       try{
        mBitmap.eraseColor(android.graphics.Color.TRANSPARENT);
        Canvas Canvas=new Canvas(mBitmap);

        action=true;
    myview.onDraw(Canvas);

        }catch(IllegalStateException ie){
            ie.printStackTrace();
        }
    }
    if(v==t2)
      {
    t30.setTextColor(Color.BLUE);
    t31.setTextColor(Color.BLUE);
    t32.setTextColor(Color.BLUE);
     mPaint.setColor(Color.BLUE);
    t30.setText("B");
    t31.setText("b");
    t32.setText("Bb");
    try{
            mBitmap.eraseColor(android.graphics.Color.TRANSPARENT);
            Canvas Canvas=new Canvas(mBitmap);
                   action=true;
        myview.onDraw(Canvas);

            }catch(IllegalStateException ie){
                ie.printStackTrace();
            }
                      }
                                  if(v==undo)
                           {

                  }
                           }
                        }

Ответы [ 2 ]

0 голосов
/ 04 августа 2014
private Slate mSlate;
private TiledBitmapCanvas mTiledCanvas;

 public void clickUndo(View unused) {

        mSlate.undo();
    }


public void undo() {
        if (mTiledCanvas == null) {
            Log.v(TAG, "undo before mTiledCanvas inited");
        }
        mTiledCanvas.step(-1);

        invalidate();
    }
0 голосов
/ 21 февраля 2012

Вместо шаблона команд, я думаю, вам следует использовать Шаблон сувениров , который предназначен для таких вещей, как отменить и повторить. Есть два способа реализовать этот шаблон. Либо сохраняя дельты, либо сохраняя целые состояния. Сохранение состояний будет проще всего в вашей ситуации, но оно занимает больше места в памяти. Это потребовало бы записи растрового изображения в файловую систему каждый раз, когда пользователь изменяет основное растровое изображение. Вы можете выбрать постоянное количество шагов отмены (например, 10), а затем сохранить 10 самых последних растровых изображений. Сохранение дельт будет более сложным. Вы реализуете это, записывая сенсорные события, цвет, кисть и т. Д. Каждого действия рисования. Затем вы можете воспроизводить и / или откатывать отдельные действия, используя события движения. Сохранение дельт занимало бы значительно меньше памяти, и вы могли бы хранить гораздо больше действий, и вам не пришлось бы записывать в файловую систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...