Android自定义ScrollView实现放大回弹效果实例代码

1,刚刚在别人开源的项目中看到了一个挺不错的用户体验,效果图如下:

2,那下面我们就来实现一下,首先看一下布局,由于一般只是我们包含头像的那部分方法,所以这里我们要把布局分成两部分,对应的布局文件效果图如下:

3,自定义ScrollView

第一步:创建一个类,继承自ScrollView,重写相应的构造函数

public class ZoomInScrollView extends ScrollView { public ZoomInScrollView(Context context) { this(context, null); } public ZoomInScrollView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ZoomInScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } }

第二步:重写OnFinishInflate()方法,并记录第一个子view,即我们的head_fragment

@Override protected void onFinishInflate() { super.onFinishInflate(); //设置不可过度滚动,否则上移后下拉会出现部分空白的情况 setOverScrollMode(OVER_SCROLL_NEVER); View child = getChildAt(0); if (child != null && child instanceof ViewGroup) { //获取默认第一个子View mHeaderView = ((ViewGroup) child).getChildAt(0); } }

第三步:重写OnTouchEvent()方法,在Action_Move方法中拿到下滑的距离,通过设置head_view的属性参数来改变它的大小,在UP的时候还原head_view

@Override public boolean onTouchEvent(MotionEvent ev) { if (mHeaderView == null) return super.onTouchEvent(ev); switch (ev.getAction()) { case MotionEvent.ACTION_MOVE: if (!mIsPulling) { //第一次下拉 if (getScrollY() == 0) { //在顶部的时候,记录顶部位置 mLastY = (int) ev.getY(); } else { break; } } if (ev.getY() - mLastY < 0) return super.onTouchEvent(ev); int distance = (int) ((ev.getY() - mLastY) * mScaleRatio); mIsPulling = true; setZoom(distance); return true; case MotionEvent.ACTION_UP: mIsPulling = false; replyView(); break; } return super.onTouchEvent(ev); }

在回弹view的时候通过属性动画动态的改变head_view的值,并重写onSizeChange()方法,实时的记录head_view的宽高

/** ** 放大view */ private void setZoom(float s) { float scaleTimes = (float) ((mHeaderWidth + s) / (mHeaderWidth * 1.0)); // 如超过最大放大倍数,直接返回 if (scaleTimes > mScaleTimes) return; ViewGroup.LayoutParams layoutParams = mHeaderView.getLayoutParams(); layoutParams.width = (int) (mHeaderWidth + s); layoutParams.height = (int) (mHeaderHeight * ((mHeaderWidth + s) / mHeaderWidth)); // 设置控件水平居中 ((MarginLayoutParams) layoutParams).setMargins(-(layoutParams.width - mHeaderWidth) / 2, 0, 0, 0); mHeaderView.setLayoutParams(layoutParams); } /** * 回弹 */ private void replyView() { final float distance = mHeaderView.getMeasuredWidth() - mHeaderWidth; // 设置动画 ValueAnimator anim = ObjectAnimator.ofFloat(distance, 0.0F).setDuration((long) (distance * mReplyRatio)); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { setZoom((Float) animation.getAnimatedValue()); } }); anim.start(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mHeaderWidth = mHeaderView.getMeasuredWidth(); mHeaderHeight = mHeaderView.getMeasuredHeight(); }

这样就实现了我们的效果了,看一下我们自己实现的效果:

demo下载:ZoomInScrollView_jb51.rar

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

时间: 2024-10-25 01:26:34

Android自定义ScrollView实现放大回弹效果实例代码的相关文章

Android自定义ScrollView实现放大回弹效果

背景 在很多项目中我们都会用到ScrollView这个控件,因为ScrollView能够在屏幕内容多时下上滑动以适配加载的内容.但是ScrollView滑动时效果感觉太死板了,这个时候我们如果给它添加一个回弹的动画效果,会让界面交互更加舒服,提升用户体验效果. 自定义ScrollView 1.创建一个类,继承ScrollView并重写相应的构造函数 public class ZoomInScrollView extends ScrollView { public ZoomInScrollView

Android界面上拉下拉的回弹效果实例代码

废话不多说,具体代码如下所示: public class MyScrollView extends ScrollView { private View childView; public MyScrollView(Context context) { super(context); } public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public MyScrollView(Co

Android 实现ViewPager边界回弹效果实例代码

废话不多说了,直接给大家贴代码了,具体代码如下所示: public class BounceBackViewPager extends ViewPager { private int currentPosition = 0; private Rect mRect = new Rect();//用来记录初始位置 private boolean handleDefault = true; private float preX = 0f; private static final float RATI

Android 自定义gradle property详解及实例代码

Android 自定义gradle property 在Android studio上运行项目,gradle的配置是必不可少的,但是随着项目的逐渐成长,迎面而来的就是.各种依赖包的添加,数不胜数的签名,渠道包等,整个gradle变得很乱,这样其实我们可以将gradle的部分内容分离出来放在另一个自定义gradle内. 如这时我们添加的Plugin 就只要对其赋值就可以了. 步骤: 在总项目根目录下创建 dependencies.gradle文件(名字可以自定义) 根目录下创建的自定义内容如下:

android自定义进度条渐变色View的实例代码

这个自定义的view,完全脱离了android自带的ProgressView,并且没使用一张图片,这样就能更好的降低程序代码上的耦合性! 下面我贴出代码  ,大概讲解一下实现思路吧! package com.spring.progressview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Linear

android自定义进度条渐变色View的实例代码_Android

最近在公司,项目不是很忙了,偶尔看见一个兄台在CSDN求助,帮忙要一个自定义的渐变色进度条,我当时看了一下进度条,感觉挺漂亮的,就尝试的去自定义view实现了一个,废话不说,先上图吧!   这个自定义的view,完全脱离了android自带的ProgressView,并且没使用一张图片,这样就能更好的降低程序代码上的耦合性! 下面我贴出代码  ,大概讲解一下实现思路吧! 复制代码 代码如下: package com.spring.progressview; import android.cont

android ViewPager实现滑动翻页效果实例代码

实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下: import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.View; public class ReadViewPager extends ViewPager { public ReadV

Android自定义单选多选下拉列表的实例代码

发疯的产品要做一个可以单选和多选的下拉列表,陪你玩玩吧. 直接上效果: 实现方案: 我的思路是自定义一个类继承PopupWindow,里面的选项采用Listview,再结合一些动画来实现. 核心代码: public class MultiSelectPopupWindows extends PopupWindow { private Context context; private View parent; private List<Search> data; private int ySta

android中Bitmap的放大和缩小实例代码_Android

复制代码 代码如下: /**Bitmap放大的方法*/ private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.postScale(1.5f,1.5f); //长和宽放大缩小的比例 Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); return