Cómo hacer una vista de seguir a mi dedo con onScroll y GestureDetector – Android

Tengo un RelativeLayout con un TextView en el medio. Lo tengo para detectar eventos onFling, onDown y onScroll usando SimpleOnGestureListener ().

Quisiera que el TextView siguiera mi dedo alrededor de la pantalla (puede estar apenas en el eje de x), y cuando levanto mi dedo para que esté tan animado fuera de la pantalla o de nuevo al centro (dependiendo de hasta dónde he llegado) Lo movió).

Esto es lo que normalmente hago en estos casos.

En primer lugar, su método onScroll debería ser algo como esto:

@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // Make sure that mTextView is the text view you want to move around if (!(mTextView.getLayoutParams() instanceof MarginLayoutParams)) { return false; } MarginLayoutParams marginLayoutParams = (MarginLayoutParams) mTextView.getLayoutParams(); marginLayoutParams.leftMargin = (int) marginLayoutParams.leftMargin - distanceX; marginLayoutParams.topMargin = (int) marginLayoutParams.topMargin - distanceY; mTextView.requestLayout(); return true; } 

Estamos modificando leftMargin y topMargin una cantidad equivalente a la distancia que se ha desplazado.

A continuación, para volver a animar la vista de texto a su posición original, debe hacerlo cuando el evento sea ACTION_UP o ACTION_CANCEL :

 @Override public boolean onTouch(View arg0, MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { snapBack(); } return mScrollDetector.onTouchEvent(event); } 

A continuación, en el método snapBack animamos la vista de texto:

 private void snapBack () { if (mTextView.getLayoutParams() instanceof MarginLayoutParams) { final MarginLayoutParams marginLayoutParams = (MarginLayoutParams) mTextView.getLayoutParams(); final int startValueX = marginLayoutParams.leftMargin; final int startValueY = marginLayoutParams.topMargin; final int endValueX = 0; final int endValueY = 0; mTextView.clearAnimation(); Animation animation = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { int leftMarginInterpolatedValue = (int) (startValueX + (endValueX - startValueX) * interpolatedTime); marginLayoutParams.leftMargin = leftMarginInterpolatedValue; int topMarginInterpolatedValue = (int) (startValueY + (endValueY - startValueY) * interpolatedTime); marginLayoutParams.topMargin = topMarginInterpolatedValue; mTextView.requestLayout(); } }; animation.setDuration(200); animation.setInterpolator(new DecelerateInterpolator()); mTextView.startAnimation(animation); } } 

Y que debería hacer! Puede modificar las variables endValueX y endValueY para controlar dónde retrocede la vista de texto al levantar el dedo.

  • ¿Por qué obtengo NullPointerException cuando uso setCurrentText o setText para TextSwitcher?
  • Cómo cambiar TextView texto en DataChange sin llamada atrás TextWatcher Listener
  • Android TextView SingleLine campo oculta texto largo
  • Cómo formatear una actividad de otra actividad mediante opciones de menú
  • Android - Cómo configurar el relleno para TextView en ListView o ExpandableListView
  • Verdaderamente el texto de alineación superior en Android TextView
  • Cómo se desvaneció un carácter único en un TextView
  • La gravedad de TextView no funciona con hebreo
  • Línea de archivo XML binario # 26: Error al inflacionar la clase android.widget.TextView
  • Espaciado de líneas por defecto de Android TextView
  • Cómo establecer programaticamente maxLength en Android TextView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.