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)
编辑我想要做的是显示进度,即当用户移动他的手指时,应该绘制形状.
建议/样品/链接任何事情将不胜感激.
您将直接更新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)
你在两个矩形之间清理画布吗?添加如下函数:
void clearCanvas()
{
canvas.drawRect(0,0, width, height, paint);
}
Run Code Online (Sandbox Code Playgroud)
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。希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
5825 次 |
| 最近记录: |