2019-04-09 弹性滑动NestedScrollView

作者: Android小人 | 来源:发表于2019-04-09 10:32 被阅读26次

    ios里面所有的scrollview都是弹性滑动,而安卓里面则没有这个效果,但是UE要求和Ios的效果一样,所以只能自己实现。

    import android.animation.ObjectAnimator;
    import android.animation.ValueAnimator;
    import android.content.Context;
    import android.graphics.Rect;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.widget.NestedScrollView;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.animation.TranslateAnimation;
    
    /**
     * Data:2019/4/3-下午4:49
     * Author:zxf
     **/
    public class DemoScrollView extends NestedScrollView {
    
        private Rect normal = new Rect();// 矩形,保存scrollview原始位置
    
        private boolean isScrolledToTop = true;
        private boolean isScrolledToBottom;
    
        float currentY=0;
       float distanceY=0;
    
        private View mInner;
        public DemoScrollView(@NonNull Context context) {
            super(context);
        }
    
        public DemoScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public DemoScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
            if (getScrollY() == 0) {    // 小心踩坑1: 这里不能是getScrollY() <= 0
                isScrolledToTop=true;
                isScrolledToBottom=false;
            } else if (getScrollY() + getHeight() - getPaddingTop()-getPaddingBottom() == getChildAt(0).getHeight()) {
                isScrolledToTop=false;
                isScrolledToBottom=true;
            } else {
                isScrolledToTop=false;
                isScrolledToBottom=false;
            }
        }
    
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
            if (getChildCount()>0)
                mInner= (ViewGroup) getChildAt(0);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            switch (ev.getAction()){
                case MotionEvent.ACTION_DOWN:
                    currentY=  ev.getY();
                    //finalY=ev.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    distanceY= currentY-ev.getY();
                    if (normal.isEmpty()){
                        normal.set(mInner.getLeft(),  mInner.getTop(),mInner.getRight(),  mInner.getBottom());
                    }
                    //到达最顶端
                    if (isScrolledToTop || isScrolledToBottom){
                        mInner.layout(mInner.getLeft(),  (mInner.getTop()-(int)distanceY/10),mInner.getRight(), (int) (mInner.getBottom()-(int)distanceY/10));
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    distanceY=0;
                    //弹性动画恢复到原位置
                    TranslateAnimation translateAnimation=new TranslateAnimation(0,0,mInner.getTop(),normal.top);
                    translateAnimation.setDuration(100);
                    mInner.startAnimation(translateAnimation);
                    mInner.layout(normal.left, normal.top, normal.right, normal.bottom);
                    normal.setEmpty();
                    break;
            }
            return super.dispatchTouchEvent(ev);
        }
    }
    
    

    在dispatchTouchEvent 方法中对事件,滑动位置,view的位置进行处理处理。
    在ACTION_UP中使用动画恢复view的位置,将矩形置空。效果和ios的差不多

    相关文章

      网友评论

        本文标题:2019-04-09 弹性滑动NestedScrollView

        本文链接:https://www.haomeiwen.com/subject/zegviqtx.html