使用移动手势绘制矩形

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

发生了什么事

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

码:-

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

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

build议/样品/链接任何东西将不胜感激。

Solutions Collecting From Web of "使用移动手势绘制矩形"

您直接更新onTouch()事件中的canvas而不先清除它。 这不是在视图中绘制某些东西的假设方式(假设这是你想要的)。

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

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

你清理两个矩形之间的canvas吗? 添加一个这样的function:

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

对不起亲爱的我给你整个活动巫婆我使用,并在canvas上绘制矩形。

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

在这个圣经帮助者帮助者类女巫用于显示一些消息和日志。

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

这段代码正在导致它。 因为你在这里创build了许多矩形。 相反,在onDraw(Canvas canvas)有drawRect方法,并使用无效的所有事件。 希望这可以帮助。

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

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

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