Volver a dibujar durante MotionEvent.ACTION_MOVE en onTouchEvent ()
He creado mi propio componente que extiende RelativeLayout
, dentro de él tengo un campo del tipo de la View
que se está colocando con los márgenes:
- ¿Cómo deslizar la imagen con el toque de dedo en Android?
- Inyectar eventos de pantalla táctil, Android 5.0, dev / input / eventX
- Por qué siempre obtengo ACTION_DOWN de onTouchEvent
- Android: forma de botón personalizada
- No mostrar MotionEvent.ACTION_UP o MotionEvent.ACTION_CANCEL
El cuadrado azul representa mi opinión del padre, y un círculo rojo es un niño.
Ahora quiero permitir al usuario mover este círculo rojo mientras mueve un dedo sobre una pantalla. Este es mi método 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; }
Pero rápidamente descubrí que no actualizar su posición mientras el usuario está moviendo su dedo en una pantalla, sino que lo hace sólo cuando el usuario libera el dedo de la pantalla. Así que, básicamente, cuando muevo mi dedo, el círculo permanece en la misma posición, pero cuando dejo de mover, el círculo se dibuja en una nueva posición. Intenté usar el método invalidate()
en las vistas de ambos, padre y hijo, pero no ayudó. Supongo que puede tener algo que ver con el hilo de la interfaz de usuario, pero no tengo acceso al runOnUiThread()' method as it's not an
actividad.
EDIT: Pasé una actividad a mi clase, para que pueda utilizar runOnUiThread()
. Mi case: ACTION_MOVE
ahora se parece a esto:
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;
- Evento de Android Touch en la pantalla
- Android Touch Evento que determina la duración
- ¿Qué se llama un toque de salto en la documentación de Android?
- Android SimpleOnGestureListener.onFling obtener un objeto nulo MotionEvent
- Ocultar el botón y mostrar de nuevo en el tacto
- ¿Cómo sé si un MotionEvent es relativo o absoluto?
- Desplazamiento suave con inercia y resistencia de los bordes / snapback
- Android - ImageView en el clic
Si es puntero simple usted puede dibujarlo en Canvas
como Drawable
:
@Override protected void onDraw(Canvas canvas) { pointer.setBounds(marginX, marginY, marginX + pointerWidth, marginY + pointerHeight); pointer.draw(canvas); super.onDraw(canvas); }
A continuación, onTouchEvent()
invalidate()
en el puntero del método onTouchEvent()
.
Creo que necesita arrastrar y soltar la función
Consulte http://www.vogella.com/articles/AndroidDragAndDrop/article.html
- SetColorFilter () y mutable drawables
- Android: Establece la velocidad de adaptación automática del brillo