使用移动手势绘制矩形

时间:2012-12-21 09:29:57

标签: android graphics android-canvas ondraw rect

我正在尝试创建一个矩形,但是当我从起始坐标移动到结束坐标时会发生这种情况

is what happens

,实际上我想显示当用户从一个点移动到另一个点时的进度。这就是我想要的。 I would like to have

代码: -

public boolean onTouch(View v, MotionEvent event) {

    int action = event.getAction();
    switch (action) {
    case MotionEvent.ACTION_DOWN:
        downx = event.getX();
        downy = event.getY();

    //v.invalidate();
        break;
    case MotionEvent.ACTION_MOVE:
        upx = event.getX();
        upy = event.getY();

         canvas.drawRect(downx, downy, upx, upy, paint);

         }
        choosenImageView.invalidate();
        break;
    case MotionEvent.ACTION_UP:
        upx = event.getX();
        upy = event.getY();
            canvas.drawRect(downx, downy, upx, upy, paint);
            }
        } 

        // v.invalidate();
        break;
    }
    return true;
}

编辑我想要做的是显示进度,即当用户移动手指时,应绘制形状。

建议/样品/链接任何事情都将不胜感激。

5 个答案:

答案 0 :(得分:9)

您正在直接更新onTouch()事件中的画布而不先清除它。这不是在视图中绘制内容的假设方式(假设这是你想要的)。

相反,您应该存储矩形的开始和当前坐标,并在onDraw()事件中使用它们来绘制实际矩形(在Adnroid为您清除Canvas的无效部分之后)。如果需要重绘画布,Android将发出此事件,因此您需要使用onTouch()方法告知invalidate()事件中这是必需的:

class myView extends View { // or some other View-based class
   boolean drawRectangle = false;
   PointF beginCoordinate;
   PointF endCoordinate;

   public boolean onTouch(View v, MotionEvent event) {
      switch(event.getAction()) {
         case MotionEvent.ACTION_DOWN:
            drawRectangle = true; // Start drawing the rectangle
            beginCoordinate.x = event.getX();
            beginCoordinate.y = event.getY();
            endCoordinate.x = event.getX();
            endCoordinate.y = event.getY();
            invalidate(); // Tell View that the canvas needs to be redrawn
            break;
         case MotionEvent.ACTION_MOVE:
            endCoordinate.x = event.getX();
            endCoordinate.y = event.getY();
            invalidate(); // Tell View that the canvas needs to be redrawn
            break;
         case MotionEvent.ACTION_UP:
            // Do something with the beginCoordinate and endCoordinate, like creating the 'final' object
            drawRectangle = false; // Stop drawing the rectangle
            invalidate(); // Tell View that the canvas needs to be redrawn
            break;
      }
      return true;
   }

   protected void onDraw(Canvas canvas) {
      if(drawRectangle) {
         // Note: I assume you have the paint object defined in your class
         canvas.drawRect(beginCoordinate.x, beginCoordinate.y, endCoordinate.x, endCoordinate.y, paint);
      }
   }
}

答案 1 :(得分:6)

你在两个矩形之间清理画布吗? 添加如下函数:

 void clearCanvas()
  {
     canvas.drawRect(0,0, width, height, paint);

  }

答案 2 :(得分:3)

抱歉,亲爱的,我给你使用的全部活动,并在画布上绘制rect。

public class CanvasExample extends Activity 
    {
        /** Called when the activity is first created. */

        RelativeLayout relMainOperationLayout;
        RelativeLayout relTabHeader;
        //RelativeLayout relMidalLayout;
        RelativeLayout relBelowLayout;
        Context myContext;
        DrawCanvas drawCanvas;
        static boolean loadFlage=true;
        BibleHelper bibleHelper;

         Bitmap mainBitmap;




        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            myContext=CanvasExample.this;
            bibleHelper=new BibleHelper(CanvasExample.this,myContext);
            bibleHelper.setFullScreen();

            LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);   

            int layoutId = myContext.getResources().getIdentifier("main","layout",getPackageName());

            relMainOperationLayout = (RelativeLayout) layoutInflater.inflate(layoutId,null);

            relTabHeader=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relHeadLayout);

            //relMidalLayout=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relmidalLayout);

            relBelowLayout=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relBelowLayout);



            mainBitmap=getIconDrawable(R.drawable.splash);


            drawCanvas=new DrawCanvas(CanvasExample.this,myContext);

            //drawCanvas.setBackgroundColor(Color.YELLOW);

            //drawCanvas.setBackgroundDrawable(CanvasExample.this.getResources().getDrawable(R.drawable.splash));

            drawCanvas.setBackgroundDrawable(new BitmapDrawable(mainBitmap));



            RelativeLayout.LayoutParams drawParams=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

            drawParams.addRule(RelativeLayout.BELOW, relTabHeader.getId());

            //relMidalLayout.addView(drawCanvas,drawParams);

            relMainOperationLayout.addView(drawCanvas,drawParams);


//          mainImageView=new ImageView(CanvasExample.this);
//          
//          RelativeLayout.LayoutParams mainParams=new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,200);
//          relMainOperationLayout.addView(mainImageView,mainParams);
//          mainImageView.setBackgroundDrawable(CanvasExample.this.getResources().getDrawable(R.drawable.ic_launcher));





            setContentView(relMainOperationLayout);



        }




        class DrawCanvas extends View
        {

            Context drawContext;
            Activity drawActivity;
            ImageView image;
            Paint mPaint;
            int left=0,right=0,top=0,bottom=0;
            Canvas passCanvas;

            //Bitmap bitmapOrg;
            // bitmapOrg;

            public DrawCanvas(Activity activity,Context context)
            {
                super(activity);

                this.drawActivity=activity;

                this.drawContext=context;

                //bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.splash);

                    mPaint = new Paint();

                    mPaint.setDither(true);

                    mPaint.setColor(Color.RED);

                    mPaint.setStyle(Paint.Style.STROKE);

                    mPaint.setStrokeJoin(Paint.Join.ROUND);

                    mPaint.setStrokeCap(Paint.Cap.ROUND);

                    mPaint.setStrokeWidth(3);

                    mPaint.setFilterBitmap(true);

                this.setOnTouchListener(new View.OnTouchListener() {

                    //@Override
                    public boolean onTouch(View v, MotionEvent event)
                    {

                        switch (event.getActionMasked()) 
                        {
                        case MotionEvent.ACTION_DOWN:

                            invalidate();

                            left=(int) event.getX();
                            right=left+1;
                            top=(int) event.getY();
                            bottom=top+1;               
                            mPaint.setColor(Color.BLACK);
                            onDraw(passCanvas=new Canvas());
                        break;

                        case MotionEvent.ACTION_MOVE:                   
                            invalidate();
                            int tempX=(int) event.getX();

                            //System.err.println("Get X->"+event.getX());
                            if(tempX>right)
                            {
                                right=right+1;
                            }
                            else
                            {
                                right=right-1;

                            }
                            //System.err.println("Get Y->"+event.getY());
                            int tempY=(int) event.getY();

                            if(tempY>bottom)
                            {
                                bottom=bottom+1;                

                            }else
                            {
                                bottom=bottom-1;                

                            }

                            mPaint.setColor(Color.GREEN);
                            onDraw(passCanvas=new Canvas());
                        break;

                        case MotionEvent.ACTION_UP:
                            invalidate();
                            mPaint.setColor(Color.RED);
                            onDraw(passCanvas=new Canvas());
                            System.err.println("After Touch Up");
                            CanvasExample.loadFlage=false;
                            onDraw(passCanvas=new Canvas());


                            /*
                            bibleHelper.showErrorLog("Start X -->"+left);

                            bibleHelper.showErrorLog("Real  X -->"+event.getX());

                            bibleHelper.showErrorLog("End X-->"+right);

                            bibleHelper.showErrorLog("Start Y-->"+top);

                            bibleHelper.showErrorLog("Real Y-->"+top);


                            bibleHelper.showErrorLog("End Y-->"+bottom);
                            */

                            Bitmap croppedBmp = Bitmap.createBitmap(mainBitmap,left,top,right,bottom);


                            final Dialog dialog = new Dialog(CanvasExample.this);

                            dialog.setContentView(R.layout.custom_dialog);
                            dialog.setTitle("Title...");
                            dialog.setCancelable(true);

                            ImageView image = (ImageView) dialog.findViewById(R.id.main);
                            image.setImageBitmap(croppedBmp);
                            Button btnClose=(Button) dialog.findViewById(R.id.btnClose);

                            btnClose.setOnClickListener(new View.OnClickListener() 
                            {

                                public void onClick(View v) 
                                {
                                    dialog.dismiss();
                                }
                            });

                            dialog.show();

                        break;

                        default:

                            break;
                        }
                        return true;
                    }
                });     

            }

            @Override
            protected void onDraw(Canvas canvas) 
            {

                canvas.drawRect(left, top, right, bottom, mPaint);
            }

        }
        private Bitmap getIconDrawable(int imageId)
        {
            //Drawable rtnDrawable = null;
            Bitmap imageBitmap=null;
            try 
            {
                int getImageWH[];
                imageBitmap = BitmapFactory.decodeResource(getResources(),imageId);
                int IW = imageBitmap.getWidth();
                int IH = imageBitmap.getHeight();

                bibleHelper.showErrorLog("Icon Width->" + IW);
                bibleHelper.showErrorLog("Icon Height->" + IH);

                WindowManager winManager = (WindowManager) CanvasExample.this.getSystemService(Context.WINDOW_SERVICE);
                int screenwidth = winManager.getDefaultDisplay().getWidth();
                int screenheight = winManager.getDefaultDisplay().getHeight();  

                getImageWH = bibleHelper.getObjectWidthHeight(screenwidth,screenheight, IW, IH);

                bibleHelper.showErrorLog("Get Icon Width->" + getImageWH[0]);
                 bibleHelper.showErrorLog("Get Icon Height->" + getImageWH[1]);

                imageBitmap = Bitmap.createScaledBitmap(imageBitmap, getImageWH[0],getImageWH[1], false);

                bibleHelper.showErrorLog("New Width-->"+imageBitmap.getWidth());
                bibleHelper.showErrorLog("New Height-->"+imageBitmap.getHeight());

                //rtnDrawable = (Drawable) new BitmapDrawable(imageBitmap);
            } catch (Exception ex) {
                bibleHelper.showErrorLog("Convert Icon Exception-->"+ ex.toString());
            }
            //return rtnDrawable;
            return imageBitmap;
        }


}

在这本BibleHelper中,Helper类女巫用来显示一些信息和日志。

答案 3 :(得分:2)

case MotionEvent.ACTION_MOVE:
   upx = event.getX();
   upy = event.getY();

   canvas.drawRect(downx, downy, upx, upy, paint);

   }
   choosenImageView.invalidate();
break;

此代码导致它。因为你在这里创建了许多矩形。相反,在onDraw(Canvas canvas)中有drawRect方法并对所有事件使用invalidate。希望这会有所帮助。

答案 4 :(得分:2)

如果我理解你是正确的,你希望用户在屏幕上绘制矩形,然后你就可以在显示器上绘制它。

我认为你可以画一个用户按下的点,只是为了给用户一个反馈,当他完成绘图时你用矩形代替

或者绘制矩形的线条,这样用户就可以开始绘图,并且从开始到手指有一条线,当用户改变方向时,你会从用户改变方向和手指开始一条新线,然后当用户返回开始你有一个矩形绘制为4行