实现类似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;
}
}
}