阅读背景:

基于ListView实现头部、底部视差效果

来源:互联网 
目前 尾部视差效果上拉有些许抖动,还请大神帮忙看下是什么原因
/** * Created by IT小蔡 on 2017-3-29. */public class ParallaxListView extends ListView {    private ImageView headImageView;    private ImageView footImageView;    private int maxHeight;    private int orignalHeight;    private int footOrignalHeight;    private int maxFootHeight;    private boolean isHeaderImageFlag;    private boolean isFooterImageFlag;    public ParallaxListView(Context context) {        this(context, null);    }    public ParallaxListView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public ParallaxListView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    public void setHeadImageView(final ImageView headImageView) {        this.headImageView = headImageView;        headImageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {            @Override            public void onGlobalLayout() {                headImageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);                orignalHeight = headImageView.getHeight();                Log.e(TAG, "orignalHeight:" + orignalHeight);                //获取图片原始高度                int intrinsicHeight = headImageView.getDrawable().getIntrinsicHeight();                Log.e(TAG, "intrinsicHeight:" + intrinsicHeight);                maxHeight = orignalHeight > intrinsicHeight ? orignalHeight * 2 : intrinsicHeight;            }        });    }    ;    public void setFootImageView(final ImageView footImageView) {        this.footImageView = footImageView;        footImageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()        {            @Override            public boolean onPreDraw()            {                // TODO Auto-generated method stub                footImageView.getViewTreeObserver().removeOnPreDrawListener(this);                footOrignalHeight = footImageView.getHeight();                Log.e(TAG, "footOrignalHeight:" + footOrignalHeight);                //获取图片原始高度                int footIntrinsicHeight = footImageView.getDrawable().getIntrinsicHeight();                Log.e(TAG, "footIntrinsicHeight:" + footIntrinsicHeight);                maxFootHeight = footOrignalHeight > footIntrinsicHeight ? footOrignalHeight * 2 : footIntrinsicHeight;                return true;            }        });    }    ;    /**     * @param deltaX         继续滑动X轴方向的距离     * @param deltaY         继续滑动Y轴方向的距离 负值,顶部到头,正,底部到头     * @param scrollX     * @param scrollY     * @param scrollRangeX     * @param scrollRangeY     * @param maxOverScrollX X轴方向可以滚动的最大距离     * @param maxOverScrollY Y轴方向可以滚动的最大距离     * @param isTouchEvent   true:手指拖动滑动 ,false:fling靠惯性滑动     * @return     */    @Override    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {//        Log.e(TAG, "deltaY:" + deltaY + " scrollY:" + scrollY + " scrollRangeY:" + scrollRangeY + " maxOverScrollY:" + maxOverScrollY + " isTouchEvent" + isTouchEvent);        if (deltaY < 0 && isTouchEvent) {            isHeaderImageFlag = true;//头部图片发生变化            //顶部到头,并且手指拖动            int newHeight = headImageView.getHeight() - deltaY/2;            if (newHeight > maxHeight) {                newHeight = maxHeight;            }            headImageView.getLayoutParams().height = newHeight;            headImageView.requestLayout();        }        if(deltaY >0 && isTouchEvent){            isFooterImageFlag = true;            //底部到头,并且手指拖动            int newFootHeight = footImageView.getHeight() + deltaY;            if (newFootHeight > maxFootHeight) {                newFootHeight = maxFootHeight;            }            footImageView.getLayoutParams().height = newFootHeight;            footImageView.requestLayout();        }        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        switch (ev.getAction()) {            case MotionEvent.ACTION_UP:                if (isHeaderImageFlag) {                    isHeaderImageFlag = false;                    restoreHeadImg(headImageView, orignalHeight);                }                if(isFooterImageFlag){                    isFooterImageFlag = false;                    restoreHeadImg(footImageView,footOrignalHeight);                }                break;        }        return super.onTouchEvent(ev);    }    private void restoreHeadImg(final ImageView imageView, int orignalHeight) {        ValueAnimator animator = ValueAnimator.ofInt(imageView.getHeight(), orignalHeight);        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animator) {                //获取动画的值,设置给imageview                int animatedValue = (Integer) animator.getAnimatedValue();                imageView.getLayoutParams().height = animatedValue;                imageView.requestLayout();//使ImageView的布局参数生效            }        });        animator.setDuration(400);        animator.start();    }}/** * Created 



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: