English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Mover la vista de Android3Resumen de varios métodos

Prólogo

En el desarrollo de Android, View siempre ha sido una piedra de toque para los desarrolladores de Android, por un lado, desean avanzar, por otro lado, tienen miedo de avanzar, se puede decir que el View de Android es la mayor piedra de trampolín en el camino de avanzar, porque involucra demasiado, como por ejemplo, la movilidad de View que escribiremos esta vez, además, también incluye la transmisión de eventos táctiles de View, la creación de View personalizada,这些都是极其重要且不得不面对的难题。Pero de cualquier manera, las dificultades que no se superen ahora serán superadas por las dificultades en el futuro。

Antes de eso, aún debemos entender las reglas de definición del sistema de coordenadas de Android y algunos parámetros de posición de View.

Sistema de coordenadas de Android

La posición y el tamaño de View están determinados por cuatro parámetros, es decir, left, top, right, bottom, y estos cuatro parámetros son relativos a su View padre.

int width = right-left;
 int height = bottom-top;

Después de que se complete el diseño en Activity, podemos obtener esta información de algunos métodos de View:

//Obtención de los valores left, top, right, bottom
 int left = getLeft();
 int top = getTop();
 int right = getRight();
 int bottom = getBottom();

Además de Android 3.0 se agregan los parámetros x, y, translationX, translationY, entre otros. (x, y) representa los valores x, y del View en la esquina superior izquierda del ViewGroup. translationX, translationY se utilizan para desplazar un View. Por defecto, ambos son 0, después de llamar a setTranslationX() del View./después de setTranslationY() cambia.

//Obtención de los parámetros x, y, translationX, translationY
 int x = getX();
 int y = getY();
 int translationX = getTranslationX();
 int translationY = getTranslationY();

PS: Llamar a los métodos setTranslationX() y setTranslationY() de View permite que View se desplace una distancia específica, pero este proceso se completa instantáneamente. Para que el desplazamiento de View sea más suave, se puede utilizar la animación de propiedades de View para especificar translationX y translationY.

ObjectAnimator valueAnimator = ObjectAnimator.ofFloat(textView, "translationX", 200);
 valueAnimator.setDuration(2000);
 valueAnimator.start();

Además, si se configura setTranslationX() y setTranslationY() para View, si el valor configurado no cambia, se moverá solo una vez, es decir, la distancia de movimiento especificada por primera vez. Después de revisar el código fuente, descubrimos la razón: después de configurar el valor, compara el valor configurado con el translationX y translationY actuales, y solo se mueve si no son iguales.

Después de entender algunos parámetros básicos de View, veamos sobre los tres métodos de movimiento de View.

Primero, usar scrollTo() proporcionado por el sistema Android/El método scrollBy() realiza el movimiento de View.

Ya sea scrollTo() o scrollBy(), la esencia de su movimiento es View/El contenido de ViewGroup. Y su proceso de movimiento se completa instantáneamente, por lo que, para lograr un mejor efecto de movimiento, necesita combinarse con la clase Scroller. Además, es diferente de Translation anterior, que mueve el View en sí mismo, esto necesita entender bien.

scrollTo() y scrollBy() son métodos de View, no métodos de Scroller, pero el control del movimiento suave de View está estrechamente relacionado con la clase Scroller.

scrollTo() : se refiere al movimiento a una posición absoluta, y si la posición no cambia, las llamadas múltiples no tendrán efecto.

Diagrama de proceso de scrollTo

scrollBy() : su esencia sigue siendo la llamada a scrollTo(), lo que indica la distancia relativa de movimiento de la posición actual (cada vez se suma la posición actual y la distancia configurada para llamar a scrollTo(), por lo que si la llamas varias veces, te darás cuenta de que cada vez se mueve una distancia, lo que es la diferencia esencial con scrollTo())

Diagrama de proceso de scrollBy

PS:Sobre las dos imágenes anteriores, de hecho, siempre he estado un poco confundido sobre qué es relativo y absoluto, por lo que las dos imágenes de la mano pueden facilitar la comprensión. Además, hay un problema con la dirección de movimiento de scrollTo() y scrollBy(), ya que hemos dibujado el sistema de coordenadas de Android, donde el eje x va de izquierda a derecha como positivo y el eje y va de arriba a abajo como positivo. Sin embargo, esto no se aplica a scrollTo y scrollBy, que son exactamente lo contrario, es decir, el eje x va de izquierda a derecha como negativo y el eje y va de arriba a abajo como negativo, lo que es bastante molesto.

Análisis de la clase Scroller: ¿por qué se puede usar el método de la clase Scroller para el View?/¿Cómo se mueve el contenido de ViewGroup? Intentemos analizarlo a continuación.

Primero

creamos un objeto de la clase Scroller llamado mScroller.

Luego

Para que el View se mueva a una posición específica en un tiempo específico, llamamos al método startScroll(), el método startScroll() es un método de la clase Scroller, además, en la clase Scroller también hay otro método muy utilizado llamado fluent(), que se utiliza principalmente para procesar movimientos suaves, generalmente crea efectos de inercia después del deslizamiento, haciendo que el movimiento del View sea más realista. A continuación, veamos el código fuente de startScroll():

//Recibe cuatro/Cinco parámetros. Si no se establece duration, es el valor predeterminado. Estos cuatro parámetros no son difíciles de entender, aquí no se explicará.
 public void startScroll(int startX, int startY, int dx, int dy, int duration) { 
 ...
 }

Generalmente, después de llamar a este método, también llamamos al método invalidate() del View, que puede activar el método draw() del View. Y en draw(), se llama a computeScroll(), en el código fuente encontramos que computeScroll() es un método vacío, por eso necesitamos sobrescribir el método computeScroll(). Porque la operación de movimiento real se realiza en computeScroll().

@Override
 public void computeScroll() {
 if (mScroller.computeScrollOffset()) {
  scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
  //Es necesario llamar al método postInvalidate() del View/invalidate(), si no se especifica, causará que el movimiento del View solo se realice en la primera toma.
  postInvalidate();
 }
 super.computeScroll();
 }

Lo que vimos anteriormente en la clase Scroller, hay otro método llamado computeScrollOffset(), ¿qué hace esto? Su función principal es determinar si mCurrX y mCurrY han cambiado, si lo han hecho, devuelve true, si no, devuelve false. A través de la determinación de este método, podemos indicar si es necesario llamar continuamente a scrollTo() para mover el View. Aquí hay un ejemplo que utiliza scrollTo() para que el View siga el movimiento del dedo:

public class CuView extends LinearLayout {
 private float mStartX;
 private float mStartY;
 private Scroller mScroller;
 /**
 * ¿Ha completado el primer deslizamiento?
 */
 private boolean isFirstFinish;
 public CuView(Context context) {
 super(context);
 init(context);
 }
 public CuView(Context context, AttributeSet attrs) {
 super(context, attrs);
 init(context);
 }
 private void init(Context context) {
 mScroller = new Scroller(context);
 }
 public CuView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 init(context);
 }
 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
 public CuView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
 super(context, attrs, defStyleAttr, defStyleRes);
 init(context);
 }
 /**
 * Deje que View siga a su dedo
 * @param event
 * @return
 */
 @Override
 public boolean onTouchEvent(MotionEvent event) {
 int action = event.getAction();
 switch (action) {
  case MotionEvent.ACTION_DOWN:
  /**
   * Después de completar el primer movimiento, no necesitamos obtener la posición de inicio nuevamente, de lo contrario causará que View se mueva nuevamente desde su posición de inicio.
   */
  if (!isFirstFinish) {
   mStartX = event.getRawX();
   mStartY = event.getRawY();
  }
  break;
  case MotionEvent.ACTION_MOVE:
  scrollTo((int) (mStartX - event.getRawX()), (int) (mStartY - event.getRawY());
  break;
  case MotionEvent.ACTION_UP:
  //La primera vez que se completa el desplazamiento
  isFirstFinish = true;
  break;
 }
 return true;
 }
 /**
 * Prueba de startScroll
 */
 public void startScroll() {
 /**
  * Tenga en cuenta la dirección de desplazamiento del Scroller,
  */
 mScroller.startScroll(20, 20, -500, -500, 5000);
 invalidate();
 }
 @Override
 public void computeScroll() {
 if (mScroller.computeScrollOffset()) {
  scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
  invalidate();
 }
 super.computeScroll();
 }
}

Segundo, use animaciones para realizar el desplazamiento del View.

Esto incluye la animación de tween del View/Animación de cuadro, así como3Después de .0 se agregó Property Animation. Mueve una imagen del View, la posición y el tamaño del View en sí no han cambiado en absoluto.

Tercero, configure los LayoutParams del View para mover el View

LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) textView.getLayoutParams();
 layoutParams.leftMargin = 50;
 textView.requestLayout();

Resumen

Esto es un resumen del desplazamiento del View de Android3Este artículo incluye todo el contenido de las formas, espero que el contenido de este artículo pueda ayudar a todos a desarrollar Android, si tienen alguna pregunta, pueden dejar comentarios para intercambiar.

Te gustará