android listview视差滚动,仿QQ空间视差效果,ListView.setHeader( )(示例代码)

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值