7

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

会发生什么

,实际上我想在用户从一个点移动到另一个点时显示进度。这就是我想要的。我想拥有.

代码:-

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;
}

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

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

4

6 回答 6

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);
      }
   }
}
于 2012-12-21T09:48:19.257 回答
6

你清洁两个矩形之间的画布吗?添加这样的功能:

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

  }
于 2012-12-30T15:08:13.457 回答
3
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 。希望这可以帮助。

于 2012-12-21T09:48:00.557 回答
3

抱歉,亲爱的,我给你整个活动女巫我使用并在画布上绘制矩形。

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 类女巫用于显示一些消息和日志。

于 2013-01-04T04:29:11.723 回答
2

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

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

或者画矩形的线,所以用户开始画,你从开始到他的手指有一条线,当用户改变方向时,你从用户改变方向和手指的地方开始一条新线,然后当用户返回开始你有一个矩形绘制为 4 行

于 2013-01-03T18:18:39.473 回答
0

这是转换为Kotlin的 Vegers 答案。

override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
    if (startedDrawing) {
        canvas.drawRect(startPoint.x, startPoint.y, currentPoint.x, currentPoint.y, mPaint)
    }
    
}

override fun onTouchEvent(event: MotionEvent): Boolean {
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {
            startedDrawing = true
            startPoint.x = event.x
            startPoint.y = event.y
            currentPoint.x = event.x
            currentPoint.y = event.y
            invalidate()
        }
        MotionEvent.ACTION_MOVE -> {
            currentPoint.x = event.x
            currentPoint.y = event.y
            invalidate()
        }
        MotionEvent.ACTION_UP -> {
            startedDrawing = false
            invalidate()
        }
    }
    return true
}
于 2021-10-08T13:26:52.413 回答