前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android自定义scrollView实现顶部图片下拉放大

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

作者头像
砸漏
发布2020-10-29 22:53:32
6980
发布2020-10-29 22:53:32
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

本文实例为大家分享了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  

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档