基于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();
    }

}

下载地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值