如何通过拖动在Android中绘制线条

时间:2015-02-03 05:28:53

标签: android

我正在创建一个教练委员会。我的目标是在两点之间画一条线。初始位置如下图所示: enter image description here

如果我将芯片拖离初始位置,它应画一条线。当我移动芯片时,它应该总是画一条线。

这就是我的尝试:

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

2 个答案:

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

}

希望这对您和其他社区有帮助,如果您需要更多描述,请随时询问。