我正在创建一个教练委员会。我的目标是在两点之间画一条线。初始位置如下图所示:
如果我将芯片拖离初始位置,它应画一条线。当我移动芯片时,它应该总是画一条线。
这就是我的尝试:
case MotionEvent.ACTION_UP:
Toast.makeText(this, "here", Toast.LENGTH_SHORT).show();
Bitmap bitmap = Bitmap.createBitmap((int) getWindowManager()
.getDefaultDisplay().getWidth(), (int) getWindowManager()
.getDefaultDisplay().getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setColor(Color.BLACK);
paint.setStrokeWidth(10);
int startx = 50;
int starty = 100;
int endx = 150;
int endy = 210;
canvas.drawLine(startx, starty, endx, endy, paint);
break;
我将该代码放在芯片的ontouchlistener中。 您可以在此处下载项目:https://www.dropbox.com/s/ggfbsbkaokj9vxi/CoachingBoard.rar?dl=0
答案 0 :(得分:1)
在进一步检查您的代码后,我相信我已经实现了您的喜好。
我们将转到DrawingView
并为drawCanvas
定义一个getter,因此我们可以在DrawingView
类之外访问我们的画布。
接下来,我们将前往Basketball
并执行以下操作:
float startX;
float startY;
public boolean onTouch(View view, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getRawX();
startY = event.getRawY();
...
break;
case MotionEvent.ACTION_UP:
Paint paint = new Paint(); //set this as a field in drawView with another getter to avoid garbage collection penalties
paint.setStrokeWidth(15f);
paint.setColor(Color.BLACK);
drawView.getCanvas().drawLine(startX, startY, event.getRawX(), event.getRawY(), paint);
drawView.invalidate();
break;
}
}
这是做什么的:当你拿起芯片时它将保存起始坐标,当你放下芯片时,它将在你的drawView
画布中从头到尾画一条线。
您甚至可以将线条绘制为连续的Path
,以便线条始终触摸,但这不在此答案的上下文之内。
答案 1 :(得分:0)
通过拖动绘制线条的最佳解决方案是从ACTION_DOWN获取x和y位置,然后在switch语句之外从ACTION_MOVE获取下一个x和y位置,从而使画布无效。用此开始x,y和结束x,y位置画线。
所有这些解释的代码如下:
public class TouchEventView extends View {
float downxpos;
float downypos;
float upxpos;
float upypos;
private Paint paint = new Paint();
private Path path = new Path()
public TouchEventView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setColor(Color.GREEN);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawLine(downxpos, downypos, upxpos, upypos, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downxpos = event.getX();
downypos = event.getY();
case MotionEvent.ACTION_MOVE:
upxpos = event.getX();
upypos = event.getY();
break;
default:
return false;
}
invalidate();
return true;
}
}
希望这对您和其他社区有帮助,如果您需要更多描述,请随时询问。