Android自定义scrollView实现顶部图片下拉放大

2020-10-29 22:53:32 浏览数 (3)

本文实例为大家分享了scrollView实现顶部图片下拉放大的具体代码,供大家参考,具体内容如下

之前的scrollView顶部图片下拉放大在之后的项目用到了几次,但没次都写在Activity中很麻烦,也不方便复用。这几天有空,所以重新使用自定义scrollView的方法实现这个效果。原理和之前的基本是一致的,所以也不多说了,直接上代码。

代码语言:javascript复制
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: 
//手指离开后恢复图片 
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) { // 当前位置比记录位置要小,正常返回 
break; 
} 
// 处理放大 
mScaling = true; 
setZoom(1   distance); 
return true; // 返回true表示已经完成触摸事件,不再处理 
} 
return false; 
} 
// 回弹动画 (使用了属性动画) 
public void replyImage() { 
final float distance = dropZoomView.getMeasuredWidth() - dropZoomViewWidth; 
// 设置动画 
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(); 
} 
//缩放 
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); 
} 
} 

使用的时候也十分的简单

代码语言:javascript复制
<?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  

以上就是本文的全部内容,希望对大家的学习有所帮助。

0 人点赞