仿QQ空间的头部可拉伸的ListView
- 继承listView
- 监听上拉下拉过界方法 overScrollBy方法
- 监听onScrollChanged方法
- 松手时回弹的效果 监听onTouchEvent 方法
代码
通过overScrollBy的这个方法可以判断出listView是够滚动过界,向下过界时那么就要放大图片zoomView.getLayoutParams().height=zoomView.getHeight()-deltaY;
zoomView.requestLayout();
zoomView
就是listView中Header的图片12345678910111213141516171819202122232425/** 使用标准行为滚动视图以滚动超出正常内容边界。* 调用此方法的视图应该覆盖onOverScrolled(int,int,boolean,boolean)以响应滚动操作的结果。* 视图可以使用此方法来处理任何触摸或基于fling的滚动。*/protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {if(deltaY>0){ // 向上过界Log.e("overScrollBy",deltaY+"");if(zoomView.getHeight()>imageHeight){ //如果现在图片的大小大于初始大小zoomView.getLayoutParams().height=zoomView.getHeight()-deltaY;zoomView.requestLayout();}}else{ //向下过界Log.e("overScrollBy",deltaY+"");//错误写法// zoomView.getLayoutParams().height=imageHeight-deltaY;// requestLayout();//放大图片,增加图片的高zoomView.getLayoutParams().height=zoomView.getHeight()-deltaY;zoomView.requestLayout();}return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);}
向下
向上
现在图片会随着手指向下放大,但是向上滑动式,却没有调用缩小,
这是因为数据量足够多也是就是listView的数据超过了一屏幕,向上滑动时没有达到向上越界的标准。
这时就要监听滑动的状态:
就要用到onScrollChanged方法了
之后要在松手后自动回弹
整体代码
|
|
|
|
header的布局文件
注意 要把
scaleType
设置成centerCrop
图像的高写在dimen中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image"
android:scaleType="centerCrop"
android:src="@mipmap/bolt"
android:layout_width="match_parent"
android:layout_height="@dimen/header_height" />
</LinearLayout>