使用移动手势绘制矩形

Yau*_*dav 7 graphics android rect ondraw android-canvas

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

是怎么回事

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

码:-

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Veg*_*ger 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);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)


Mel*_*lki 6

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

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

  }
Run Code Online (Sandbox Code Playgroud)


Vin*_*nay 3

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

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

   }
   choosenImageView.invalidate();
break;
Run Code Online (Sandbox Code Playgroud)

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