本文主要是介绍自定义控件:ListView视差动画,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
效果图
思路
在下拉过程中,不断扩大图片的height。下拉过程中图片的高度=原始ImageView的高度+下拉距离,当然也可以是下拉距离/2,这样下拉2个单位,图片的高度才增加1个单位。所以需要先要获取头布局中的ImageView,获取原高度。
当手指挪开的时候,需要让图片的高度复原,这个采用的是属性动画,在动画执行的过程中,获取value,并重新设置图片的高度。
Step1:先实现下拉过程中改变图片高度
overScrollBy()
:当headerView滑到顶部或者footerView滑到底部的视乎调用,参数说明
参数 | 说明 |
---|---|
deltaX | x轴瞬时滑动距离(偏移量) |
deltaY | y轴瞬时滑动距离 |
scrollX | x轴的滑动距离 |
scrollX | y轴的滑动距离 |
scrollRangeX | x轴滑动区间 |
scrollRangeY | y轴滑动区间 |
maxOverScrollX | x轴超过距离的最大值 |
maxOverScrollY | y轴超过距离的最大值 |
isTouchEvent | 手指是否触摸 |
这些参数:
往下滑动:value<0
往上滑动:value>0
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {if (deltaY < 0 && isTouchEvent) {int topHeight = ivHeader.getHeight() - deltaY / 2;setHeaderHeight(topHeight);}return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
}
public void setHeaderImageView(ImageView ivHeader) {this.ivHeader = ivHeader;originHeaderHeight = ivHeader.getHeight();
}private void setHeaderHeight(int newHeight) {ivHeader.getLayoutParams().height = newHeight;ivHeader.requestLayout();
}
注意:必须是ListView渲染后才可以吧headerImageView传递过去,这样获取的才是正确的高度。
ivHeader.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {listView.setHeaderImageView(ivHeader);ivHeader.getViewTreeObserver().removeOnGlobalLayoutListener(this);}
});
Step2:还原高度
手指已开后 在属性动画中获取值,改变headerImageView的高度
@Override
public boolean onTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_UP) {int currentHeight = ivHeader.getHeight();ValueAnimator valueAnimator = ValueAnimator.ofInt(currentHeight, originHeaderHeight);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {int height = (int) animation.getAnimatedValue();setHeaderHeight(height);}});valueAnimator.setInterpolator(new OvershootInterpolator());valueAnimator.setDuration(currentHeight - originHeaderHeight);valueAnimator.start();}return super.onTouchEvent(ev);
}
demo:https://gitee.com/customView/PuarallaxListView01.git
这篇关于自定义控件:ListView视差动画的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!