/**
* 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();
}
}