English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Este artículo comparte con ustedes el código específico para la implementación del desplazamiento hacia abajo y la ampliación de la imagen superior del scrollView, a modo de referencia, el contenido específico es el siguiente
El desplazamiento hacia abajo y la ampliación de la imagen superior del scrollView se ha utilizado varias veces en los proyectos posteriores, pero cada vez que se escribe en Activity es muy molesto y no es conveniente para el reuso. Tengo tiempo estos días, por lo que he vuelto a usar el método personalizado de scrollView para implementar este efecto. El principio es básicamente el mismo que el anterior, por lo que no diré más, aquí tienes el código.
package com.example.myapplication.dropzoom; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ScrollView; /** * Created by Liujinhua on 2016/3/25. * 下拉放大scrollView */ public class DropZoomScrollView extends ScrollView implements View.OnTouchListener { // 记录首次按下位置 private float mFirstPosition = 0; // 是否正在放大 private Boolean mScaling = false; private View dropZoomView; private int dropZoomViewWidth; private int dropZoomViewHeight; public DropZoomScrollView(Context context) { super(context); } public DropZoomScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public DropZoomScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFinishInflate() { super.onFinishInflate(); init(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } private void init() { setOverScrollMode(OVER_SCROLL_NEVER); if (getChildAt(0) != null) { ViewGroup vg = (ViewGroup) getChildAt(0); if (vg.getChildAt(0) != null) { dropZoomView = vg.getChildAt(0); setOnTouchListener(this); } } } @Override public boolean onTouch(View v, MotionEvent event) { if (dropZoomViewWidth <= 0 || dropZoomViewHeight <= 0) { dropZoomViewWidth = dropZoomView.getMeasuredWidth(); dropZoomViewHeight = dropZoomView.getMeasuredHeight(); } switch (event.getAction()) { case MotionEvent.ACTION_UP: //restaurar la imagen después de que el dedo se aparte mScaling = false; replyImage(); break; case MotionEvent.ACTION_MOVE: if (!mScaling) { if (getScrollY() == 0) { mFirstPosition = event.getY();// al desplazarse al inicio de la lista, registrar la posición, de lo contrario, devolver normalmente } else { break; } } int distance = (int) ((event.getY() - mFirstPosition) * 0.6); // la distancia de desplazamiento se multiplica por un coeficiente if (distance < 0) { // la posición actual es menor que la posición registrada, devolver normal break; } // manejar ampliación mScaling = true; setZoom(1 + distance); return true; // devolver true indica que ya se ha completado el evento de toque, no se procesará } return false; } // animación de rebote (usando animación de propiedades) public void replyImage() { final float distance = dropZoomView.getMeasuredWidth() - dropZoomViewWidth; // configurar animación ValueAnimator anim = ObjectAnimator.ofFloat(0.0F, 1.0F).setDuration((long) (distance * 0.7)); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float cVal = (Float) animation.getAnimatedValue(); setZoom(distance - ((distance) * cVal)); } }); anim.start(); } //ampliar public void setZoom(float s) { if (dropZoomViewHeight <= 0 || dropZoomViewWidth <= 0) { return; } ViewGroup.LayoutParams lp = dropZoomView.getLayoutParams(); lp.width = (int) (dropZoomViewWidth + s); lp.height = (int) (dropZoomViewHeight * ((dropZoomViewWidth + s) / dropZoomViewWidth)); dropZoomView.setLayoutParams(lp); } }
es bastante simple de usar
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.example.myapplication.dropzoom.DropZoomScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/bg" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/home_bg" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/home_bg" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/home_bg" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/home_bg" /> </LinearLayout> </com.example.myapplication.dropzoom.DropZoomScrollView> </LinearLayout>
Esto es todo el contenido de este artículo, espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de alarido.
Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha subido de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha realizado una edición humana y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.