Android рисует линию, чтобы следовать пальцу - PullRequest
15 голосов
/ 29 ноября 2010

Что я хочу сделать, это нарисовать линию, которая будет следовать за моим пальцем.Я создал собственное представление, и у меня есть onTouchEvent(), который работает.

Я могу нарисовать статическую линию в методе onDraw() без особых проблем.

Я не совсем уверен, как заставить линию рисовать, когда мой палец движется, хотя.

Нужно ли устанавливать координаты на onTouchEvent() и постоянно аннулировать вид, чтобы рисовать маленькие отрезки?

В конце я просто хочу иметь возможность в основном рисовать на экранеиспользуя мой палец для этого эксперимента.

Ответы [ 6 ]

30 голосов
/ 29 ноября 2010

Вы отслеживаете только события вверх и вниз.Отслеживайте событие ACTION_MOVE тоже.Помните, что он будет непрерывно отслеживаться, даже если палец человека явно не двигается.Ваш код должен выглядеть примерно так:

ACTION_DOWN: сохранить позицию.

ACTION_MOVE: если позиция отличается от сохраненной позиции, нарисуйте линию от сохраненной позиции до текущей позиции и обновите сохраненную позицию доcurrent.

ACTION_UP: Stop.

В бите ACTION_MOVE может быть хорошей идеей проверить, находится ли позиция как минимум на 2 или 3 пикселя от сохраненной позиции.Если вы собираетесь сохранить все точки графика, чтобы потом можно было что-то сделать с данными, то, возможно, увеличьте их до 10 пикселей, чтобы не получить сотни точек для простой линии.

9 голосов
/ 24 декабря 2010

Вот что я в итоге сделал. Надеюсь, это поможет некоторым начинающим начать работу.

У меня есть класс 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);
        }
    }
}

Тогда у меня есть основной игровой цикл. Это перебирает и вызывает методы рендеринга и обновления моей главной панели, которые выглядят так:

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

public void update() {
    sprite.move();
}

Позиция, в которой спрайт будет перемещаться, обрабатывается при захвате события движения:

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

Надеюсь, это полезно. Если я урежу слишком много и есть что-то, чего ты не получишь, дай мне знать.

Следующий шаг, заставляющий объект следовать линии!

3 голосов
/ 28 января 2012

Событие касания связано со списком счетчиков указателей, которые можно извлечь следующим образом:

     int p = event.getPointerCount();

итерации по этим точкам и точкам рисования могут привести к появлению непрерывной линии

if (event.getAction() == MotionEvent.ACTION_MOVE
    || event.getAction() == MotionEvent.ACTION_DOWN) {

  int p = event.getPointerCount();
     for (int i = 0; i < p; i++) { 
       c.drawPoint(event.getX(i), event.getY(i), paint);
     }
}

Предполагая, что paint уже установлен, а c - это холст, который может потребоваться заблокировать (например, в многопоточном приложении) перед его рисованием.

2 голосов
/ 13 сентября 2014

Для новичков этот код поможет вам создать каракули изображение и экспортировать его в изображение PNG здесь. Это Complete CODE , и этот класс Activity With также содержит класс View.

1 голос
/ 25 августа 2012

Прошло много времени, но этот пост все еще получает некоторые представления, поэтому я решил опубликовать несколько полезных вещей:

Учебное пособие о том, как заставить объект следовать линии: http://www.rengelbert.com/tutorial.php?id=182

Это хороший бесплатный игровой движок, который также используется в приведенном выше руководстве: http://libgdx.badlogicgames.com/

Надеюсь, это кому-нибудь поможет!

1 голос
/ 21 марта 2012

Также проверьте класс Java Path. Вы можете использовать это, чтобы нарисовать путь ... когда вы перемещаете палец по экрану. с каждым обновлением (как бы вы ни реализовывали это - например, с каждым последним обновлением), вы добавляете координаты x, y к вашему Path и заново визуализируете общий путь через цикл. просто идея, с которой я сейчас играю.

...