Перерисовать вид во время MotionEvent.ACTION_MOVE в onTouchEvent ()

Я создал свой собственный компонент, который расширяет RelativeLayout , внутри него у меня есть поле типа View , которое помещается с полями:

enter image description here

Синий квадратик представляет мое родительское представление, а красный круг - это ребенок.

Теперь я хочу разрешить пользователю перемещать этот красный круг, перемещая палец по экрану. Это мой метод onTouchEvent() :

@Override
public boolean onTouchEvent(MotionEvent event) {

    int eventAction = event.getAction();

    switch (eventAction) {
        case MotionEvent.ACTION_DOWN: 
           //finger touches the screen
            break;

        case MotionEvent.ACTION_MOVE:
                marginX = (int)event.getX();
                marginY = (int)event.getY();
                RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();//pointer is this red circle
                lp.setMargins(marginX, marginY, 0, 0);

            break;

        case MotionEvent.ACTION_UP:   
           //finger leaves the screen
            break;
    }


    return true;
}

Но я быстро обнаружил, что он не обновляет свою позицию, пока пользователь двигает пальцем по экрану, но вместо этого он делает это только тогда, когда пользователь отпускает свой палец с экрана. Таким образом, в основном, когда я перемещаю палец, круг остается в одном положении, но когда я перестаю двигаться, круг нарисован в новом положении. Я пробовал использовать метод invalidate() как для родительского, так и для детского просмотра, но это не помогло. Я предполагаю, что это может иметь какое-то отношение к потоку пользовательского интерфейса, но у меня нет доступа к методу runOnUiThread (), поскольку это не Activity`.

РЕДАКТИРОВАТЬ: Я передал действие в свой класс, чтобы использовать runOnUiThread() . Мой случай : ACTION_MOVE теперь выглядит следующим образом:

case MotionEvent.ACTION_MOVE:      
    marginX = (int)event.getX();
    marginY = (int)event.getY();

    activity.runOnUiThread(new Runnable() {
        public void run() { 
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
        lp.setMargins(marginX, marginY, 0, 0);
        pointer.invalidate();
        }
    });

break;
4
nl ja de

2 ответы

Если это простой указатель, вы можете нарисовать его на Canvas как Drawable :

@Override
protected void onDraw(Canvas canvas) {
    pointer.setBounds(marginX, marginY, marginX + pointerWidth, marginY + pointerHeight);
    pointer.draw(canvas);

    super.onDraw(canvas);
}

Затем вызовите invalidate() по указателю в методе onTouchEvent() .

2
добавлено

Я думаю, вам нужна функция перетаскивания

Refer http://www.vogella.com/articles/AndroidDragAndDrop/article.html

2
добавлено
Спасибо, ссылка, но, как я вижу, она доступна только для Android 4.0+. Разве это невозможно достичь в предыдущих версиях? Мне нужно поддерживать версию 2.3.
добавлено автор Piotr Chojnacki, источник
Неужели вы это попробовали? ,
добавлено автор Rakesh L, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)