importandroid.animation.ValueAnimator;importandroid.content.Context;importandroid.graphics.Bitmap;importandroid.util.AttributeSet;importandroid.util.Log;importandroid.view.MotionEvent;importandroid.view.ViewGroup;importandroid.view.animation.OvershootInterpolator;importandroid.widget.ImageView;importandroid.widget.ListView;/*** Created by lxj on 2017/1/5.*/
public class ParallaxListView extendsListView {publicParallaxListView(Context context) {super(context);
}publicParallaxListView(Context context, AttributeSet attrs) {super(context, attrs);
}public ParallaxListView(Context context, AttributeSet attrs, intdefStyleAttr) {super(context, attrs, defStyleAttr);
}int originalHeight;//最初的高度,就是120dp
ImageView image;int maxHeight;//小孩的最大高度,就是设定为图片本身的高度
public voidsetParallaxImage(ImageView image){this.image =image;//从dimens文件中读取image_height的值,并自动转为像素
originalHeight =getResources().getDimensionPixelSize(R.dimen.image_height);
maxHeight= this.image.getDrawable().getIntrinsicHeight();
}/*** 该方法是在listview滑动到头的时候执行,并且可以在该方法中获取到手指移动的距离
*@paramdeltaY 手指移动的距离,顶部到头是负值,底部到头是正值
*@paramscrollY scrollTo滚动的坐标
*@parammaxOverScrollY listview滑到头之后可以继续滑动的最大距离
*@paramisTouchEvent 是否是手指拖动到头,true:是, false:表示是靠惯性滑动到头
*@return
*/@Overrideprotected boolean overScrollBy(int deltaX, int deltaY, int scrollX, intscrollY,int scrollRangeX, intscrollRangeY,int maxOverScrollX, intmaxOverScrollY,booleanisTouchEvent) {//如果是手指拖动到头,并且是顶部到头,其他忽略不处理
if(isTouchEvent && deltaY<0){//让ImageView的高度随着手指移动而增高
int newHeight = image.getHeight() + Math.abs(deltaY)/3;//限制newHeight
if(newHeight>maxHeight){
newHeight=maxHeight;
}
ViewGroup.LayoutParams params=image.getLayoutParams();
params.height=newHeight;
image.setLayoutParams(params);
}return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX,
scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
}
@Overridepublic booleanonTouchEvent(MotionEvent ev) {if(ev.getAction()==MotionEvent.ACTION_UP){//让ImageView的高度缓慢恢复到最初的120高度
ValueAnimator animator =ValueAnimator.ofInt(image.getHeight(),originalHeight);//监听动画值的变化,实现自己的动画逻辑
animator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
@Overridepublic voidonAnimationUpdate(ValueAnimator animation) {int value = (int) animation.getAnimatedValue();//我们需要将value设置给高度
ViewGroup.LayoutParams params =image.getLayoutParams();
params.height=value;
image.setLayoutParams(params);
}
});
animator.setInterpolator(newOvershootInterpolator());
animator.setDuration(500);
animator.start();
}return super.onTouchEvent(ev);
}
}