自定义 头部可以缩放listview

实现类似QQ空间 跟微博下拉 头像放大的功能

ListView类
public class ScrollListView extends ListView {

	private ImageView mTIview;
	private int mTittleHight;
	private View tittleView;
	private boolean isFirst=true;
	private long DURTIME=500;
	public ScrollListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public ScrollListView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public ScrollListView(Context context) {
		super(context);
	}

	@Override
	public void addHeaderView(View v) {
		if (v != null) {
			this.tittleView = v;
		}
		super.addHeaderView(v);
	}

	public void setTittleView(ImageView tittle) {
		if (tittle != null) {
			//获取头部的初始高度,这里view可能没有布局完拿到的高度可能==0
			mTittleHight = tittle.getHeight();
			mTIview = tittle;
		}
	}

	// 当listView过度滑动时才调用,deltaY,向下拉动的y差值
	@Override
	protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
			int scrollY, int scrollRangeX, int scrollRangeY,
			int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
		// 向下拉动时 增大头部的图片View
		if (deltaY < 0) {
			setHeadLager(deltaY);
			//当过度上推时 如果头部有放大必须还原
		}else if(mTIview.getHeight()>mTittleHight&&deltaY>0){
			setHeadBack(mTIview.getHeight() + tittleView.getTop());
		}

		return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
				scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY,
				isTouchEvent);
	}

	//下拉放大头部
	private void setHeadLager(int deltaY) {
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
				ViewGroup.LayoutParams.MATCH_PARENT,
				mTIview.getHeight() - deltaY);
		mTIview.setLayoutParams(params);
		mTIview.requestLayout();
	}

	// listView 滚动是回掉
	@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {
		// 当往上推时并且 头部Viwe高度比原始高度大时 缩小头部高度
		if (tittleView.getTop() < 0 && mTIview.getHeight() > mTittleHight) {
			setHeadBack(mTIview.getHeight() + tittleView.getTop());
		}
		super.onScrollChanged(l, t, oldl, oldt);

	}

	
	//监听UP事件
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			//获取头部的初始高度,这里只有view布局完才能拿到真实高度
			if (isFirst==true) {
				mTittleHight=mTIview.getHeight();
				isFirst=false;
			}
		break;
		case MotionEvent.ACTION_UP:
			if (mTIview.getHeight()>mTittleHight) {
				//获得当前头的高度
				final int curH=mTIview.getHeight();
				setTittleBackAnimation(curH);
			}
			break;

		}
		return super.onTouchEvent(ev);
	}

	//自动回弹动画
	private void setTittleBackAnimation(final int curH) {
		ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
		animation.setDuration(DURTIME);
		animation.addUpdateListener(new AnimatorUpdateListener() {
			@Override
			public void onAnimationUpdate(ValueAnimator arg0) {
				//此处的getValue 是创建时传进去的类型
				float curPos=(Float) arg0.getAnimatedValue();//动画完成比例
				//获得动画完成时段的高度
				int height=(int) (curH-(curH-mTittleHight)*curPos);
				setHeadBack(height);
			}
		});
		//插值器
		animation.setInterpolator(new BounceInterpolator());
		animation.start();
	}
	
	//上推时头部缩回
	private void setHeadBack(int height) {
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
				ViewGroup.LayoutParams.MATCH_PARENT,
				height);
		mTIview.setLayoutParams(params);
		//这里必须让头部根不布局也重新布局
		tittleView.layout(tittleView.getLeft(), 0, tittleView.getRight(), tittleView.getBottom());
		mTIview.requestLayout();
	}
}package com.example.scrolllistview;

import com.example.scorelistview.R;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ScrollListView mScListView=(ScrollListView) findViewById(R.id.lv);
        View headView=View.inflate(getApplicationContext(), R.layout.head_list, null);
        ImageView ivHead=(ImageView) headView.findViewById(R.id.iv);
        mScListView.addHeaderView(headView);
        mScListView.setTittleView(ivHead);
        mScListView.setAdapter(new Madapter());
    }

class Madapter extends BaseAdapter{
	@Override
	public int getCount() {
		return 20;
	}
	@Override
	public Object getItem(int arg0) {
		return null;
	}
	@Override
	public long getItemId(int arg0) {
		return arg0;
	}
	@Override
	public View getView(int arg0, View arg1, ViewGroup arg2) {
		TextView view=new TextView(MainActivity.this);
		view.setText("测试项目"+arg0);
		return view;
	}
}

}

猜你喜欢

转载自blog.csdn.net/lqb3732842/article/details/52104052