Android绘制一条线来跟随你的手指

jac*_*lin 15 android drawing touch-event

我想要做的是绘制一条跟随我的手指的线.我已经创建了一个自定义视图,我有一个onTouchEvent()可行的.

我可以onDraw()毫不费力地在方法中绘制静态线.

当我的手指移动时,我不确定如何画线.

  public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            Log.e(TAG, " - DOWN -");
            Log.e(TAG, " getX: " + event.getX());
            break;
        }
        case MotionEvent.ACTION_UP: {
            Log.e(TAG, " - UP -");
            Log.e(TAG, " getX: " + event.getX());
            break;
        }
        }
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

你曾经做过一段时间的任何提示可以给出什么?

我是否需要设置坐标onTouchEvent()并不断使视图无效,以便小线段绘制?

最后,我只想用手指在屏幕上进行基本涂鸦,以进行此实验.

And*_*ith 30

您只跟踪上下事件.跟踪ACTION_MOVE事件.请注意它会连续跟踪,即使该人的手指没有明显移动.你的代码应该是这样的:

ACTION_DOWN:存储位置.

ACTION_MOVE:如果位置与存储位置不同,则从存储位置绘制一条线到当前位置,并将存储位置更新为当前位置.

ACTION_UP:停止.

在ACTION_MOVE位中,最好检查位置是否与存储位置相距至少2或3个像素.如果您要存储所有绘图点,以便稍后可以对数据执行某些操作,那么可能会将其增加到10像素,这样您就不会为简单的线条获得数百个点.


jac*_*lin 9

这就是我最终做的事情.希望这有助于其他一些初学者入门.

我有一个Sprite类,表示我想在屏幕上移动的对象:

   public class Sprite {
    private final String TAG = "Sprite";
    private Drawable drawable;
    private int x; // the X coordinate
    private int y; // the Y coordinate
    private boolean touched; // if droid is touched/picked up
    private Speed speed; // the speed with its directions

    public Sprite(Drawable drawable, int x, int y) {
        this.drawable = drawable;
        this.x = x;
        this.y = y;
        this.speed = new Speed();
    }

    public void draw(Canvas canvas) {
        drawable.setBounds(new Rect(x, y, x+drawable.getIntrinsicWidth(), y+drawable.getIntrinsicHeight()));
        drawable.draw(canvas);
    }

    public void move() {
        if (!touched) {
            x += (speed.getXv() * speed.getxDirection());
            y += (speed.getYv() * speed.getyDirection());
        }
    }

    public void handleActionDown(int eventX, int eventY) {
        if (eventX >= (x - bitmap.getWidth() / 2) && (eventX <= (x + bitmap.getWidth() / 2))) {
            if (eventY >= (y - bitmap.getHeight() / 2) && (y <= (y + bitmap.getHeight() / 2))) {
                // droid touched
                setTouched(true);
            } else {
                setTouched(false);
            }
        } else {
            setTouched(false);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个主要的游戏循环.循环并调用我的mainPanel的渲染和更新方法,如下所示:

    public void render(Canvas canvas) {
    canvas.drawColor(Color.BLACK);
    sprite.draw(canvas);
}

public void update() {
    sprite.move();
}
Run Code Online (Sandbox Code Playgroud)

精灵移动的位置在动作事件捕获中处理:

        if (event.getAction() == MotionEvent.ACTION_MOVE) {
        // the gestures
        if (sprite.isTouched()) {
            sprite.setX((int) event.getX());
            sprite.setY((int) event.getY());
        }
    }
Run Code Online (Sandbox Code Playgroud)

希望这很有帮助.如果我裁掉太多而且你有什么东西不让我知道.

下一步,使对象跟随线!

  • 什么是速度等级?你能解释一下吗? (2认同)