English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In diesem Artikel teile ich den spezifischen Code der scrollView-Realisierung der Top-Bildvergrößerung beim Ziehen nach unten mit, zur Referenz der Leser, der Inhalt ist wie folgt
Die Kombination der scrollView-Komponente, die die Top-Bildvergrößerung beim Ziehen nach unten realisiert, wurde in mehreren Projekten verwendet, aber es ist mühsam und nicht praktisch, sie in jeder Activity zu schreiben. In diesen Tagen habe ich Zeit, daher habe ich die Methode der benutzerdefinierten scrollView neu verwendet, um diesen Effekt zu realisieren. Der Prinzip ist im Grunde gleich geblieben, daher werde ich nicht weiter darauf eingehen und gehe direkt zum Code über.
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; /** * 由Liujinhua创建于 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: //手指离开后恢复图片 mScaling = false; replyImage(); break; case MotionEvent.ACTION_MOVE: if (!mScaling) { if (getScrollY() == 0) { mFirstPosition = event.getY();// 滚动到顶部时记录位置,否则正常返回 } else { break; } } int distance = (int) ((event.getY() - mFirstPosition) * 0.6); // 滚动距离乘以一个系数 if (distance < 0) { // Die aktuelle Position ist kleiner als die gespeicherte Position, normaler Rückgabewert break; } // Verarbeitung der Vergrößerung mScaling = true; setZoom(1 + distance); return true; // Rückgabe von true bedeutet, dass das Berührungsevent bereits abgeschlossen ist und nicht weiter verarbeitet werden soll } return false; } // Rückstoßanimation (verwendet Property Animation) public void replyImage() { final float distance = dropZoomView.getMeasuredWidth() - dropZoomViewWidth; // Einstellen der Animation 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(); } //Vergrößerung 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); } }
Die Verwendung ist ebenfalls sehr einfach
<?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>
Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die Anleitungshilfe stark unterstützen.
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich geschützte Inhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine E-Mail senden, um eine Meldung zu geben und relevante Beweise bereitzustellen. Sobald nachgewiesen wird, dass die Inhalte urheberrechtlich geschützt sind, wird diese Website die betreffenden urheberrechtlich geschützten Inhalte sofort löschen.)