之前在做项目的时候碰到过一个问题,废话不多说,先看我自己录制的一个效果
刚开始是想着百度搜索去看有没有合适的工具类,果不其然,搜到了很多,这里我贴上两个博客地址,大家可以先去看他们的再来看我的
https://blog.youkuaiyun.com/jky_yihuangxing/article/details/51981888
https://blog.youkuaiyun.com/zhangjg_blog/article/details/19193671
说的都很详细
可是应用到项目中会发现若我们的界面停留在顶部或底部,你再次去上拉下拉松手时就会导致回弹一部分,这是因为本身的效果就是可弹性滑动,还可回归原本位置。导致这一问题很影响用户体验,我就在此基础之上修改了他们的代码整合了起来。先贴出来如下
package com.sam.im.fddmall.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;
import com.sam.im.fddmall.R;
import static com.sam.im.fddmall.app.App.selectedColor;
import static com.sam.im.fddmall.mall.activity.MallCircleDetailActivity.linearHegiht;
import static com.sam.im.fddmall.mall.fragment.MallCircleFragment.linearHegiht_Circle;
import static com.sam.im.fddmall.mall.fragments.HomePageFragment.linearHegiht_Home;
import static com.sam.im.fddmall.uis.fragments.SetTwoFragment.linearHegiht_setTwo;
/**
* 带滚动监听的scrollview,可以计算向上滑动的距离来判断标题栏的透明度颜色
*/
public class ObservableScrollView extends ScrollView {
private static final String TAG = "ObservableScrollView";
// 当滑动的距离最小到10,才认为是上下滑动
private static final float MINI_DISTANCE = 10.0f;
//移动因子, 是一个百分比, 比如手指移动了100px, 那么View就只移动50px
//目的是达到一个延迟的效果
private static final float MOVE_FACTOR = 0.5f;
//松开手指后, 界面回到正常位置需要的动画时间
private static final int ANIM_TIME = 200;
//ScrollView的子View, 也是ScrollView的唯一一个子View
private View contentView;
//手指按下时的Y值, 用于在移动时计算移动距离
//如果按下时不能上拉和下拉, 会在手指移动时更新为当前手指的Y值
private float startY;
//用于记录正常的布局位置
private Rect originalRect = new Rect();
//手指按下时记录是否可以继续下拉
private boolean canPullDown = false;
//手指按下时记录是否可以继续上拉
private boolean canPullUp = false;
//在手指滑动的过程中记录是否移动了布局
private boolean isMoved = false;
//用来判断背景颜色的处理
private int deltaY = 0;
private int colorStart = 0;//下拉
private int colorEnd = 0;//上拉
public ObservableScrollView(Context context) {
super(context);
}
public ObservableScrollView(Context context, AttributeS