android 实现类似知乎 上推隐藏头尾 下拉出现头尾的Demo

通过 属性动画移动头尾布局, 并且设置listview头尾高度达到所需效果,但 跟知乎的相比还是有小闪动瑕疵 ,

package com.example.testhidehead;

import android.support.v7.app.ActionBarActivity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;
import android.R.integer;
import android.animation.ObjectAnimator;
import android.os.Bundle;

/**
 * 测试 listView上推隐藏头部下拉显示头部
 * 
 * @author 05
 * 
 */
public class MainActivity extends ActionBarActivity implements OnTouchListener {

	private static final int UP = 1;
	private static final int DOWM = 2;
	private float dowmY;
	private boolean isViewMoving;// 表示头部动画是否在播放
	private boolean isViewHidden;//
	private TextView tittle;
	private View headView;
	private TextView footer;
	private View footerView;
	private static final int MOVING_TIME = 500;// 头或者为移动的时间

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ListView lv = (ListView) findViewById(R.id.lv);
		tittle = (TextView) findViewById(R.id.tittle);// 头tittle
		footer = (TextView) findViewById(R.id.footer);// /尾巴
		// listView head,作用填充被头部遮住的区域
		headView = new View(getApplicationContext());
		AbsListView.LayoutParams params = new AbsListView.LayoutParams(
				LayoutParams.MATCH_PARENT, tittle.getHeight());
		// listView footer,作用填充被尾部遮住的区域
		footerView = new View(getApplicationContext());
		AbsListView.LayoutParams params1 = new AbsListView.LayoutParams(
				LayoutParams.MATCH_PARENT, footer.getHeight());
		footerView.setLayoutParams(params1);
		headView.setLayoutParams(params);
		lv.addHeaderView(headView);
		lv.addFooterView(footerView);
		lv.setOnTouchListener(this);
		lv.setAdapter(new Madapter());
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			dowmY = event.getY();
			break;
		case MotionEvent.ACTION_MOVE:
			float moveY = event.getY();

			if (dowmY - moveY < -100) {// 下滑,这里简单的以下滑超过100px则认为是下滑
				if (isViewHidden) {
					startMoveView(tittle, DOWM);
					startMoveView(footer, DOWM);
					isViewMoving=true;
				}
			} else if (dowmY - moveY > 100) {// 上滑
				if (isViewHidden==false) {
					startMoveView(tittle, UP);
					startMoveView(footer, UP);
					isViewMoving=true;
				}
			}
			break;
		case MotionEvent.ACTION_UP:

			break;
		}
		return false;
	}

	/**
	 * 移动view 动画跟设置头尾 高度
	 * 
	 * @param moveView
	 * @param flag
	 */
	private void startMoveView(final View moveView, int flag) {
		if (moveView == null || isViewMoving) {
			return;
		}
		int moveStarY = 0;
		int moveEndY = 0;
		int layoutParamsHight = 0;
		if (moveView == tittle && flag == DOWM) {
			moveStarY = -moveView.getHeight();
			layoutParamsHight=moveView.getHeight();
			setLayoutParms(layoutParamsHight, headView);
			postDelay(moveView, headView, flag);
		} else if (moveView == footer && flag == DOWM) {
			layoutParamsHight=moveView.getHeight();
			setLayoutParms(layoutParamsHight, footerView);
			moveStarY = moveView.getHeight();
			postDelay(moveView, footerView, flag);
		} else if (moveView == tittle && flag == UP) {
			moveEndY = -moveView.getHeight();
			postDelay(moveView, headView, flag);
		} else if (moveView == footer && flag == UP) {
			moveEndY = moveView.getHeight();
			postDelay(moveView, footerView, flag);
		}
		moveAmin(moveView, moveStarY, moveEndY);
	}

	// 隐藏动画之后把头尾高度设为0
	private void postDelay(final View moveView, final View parmsView,
			final int flag) {
		moveView.postDelayed(new Runnable() {
			@Override
			public void run() {
				if (flag == UP) {
					setLayoutParms(0, parmsView);
					isViewHidden = true;
				} else {
					isViewHidden = false;
				}
				isViewMoving = false;
			}
		}, MOVING_TIME);
	}

	// 设置list头尾参数
	private AbsListView.LayoutParams setLayoutParms(int layoutParamsHight,
			View v) {
		AbsListView.LayoutParams params = new AbsListView.LayoutParams(
				LayoutParams.MATCH_PARENT, layoutParamsHight);
		if (v == null) {
			return params;
		}
		v.setLayoutParams(params);
		return params;
	}

	// 开始动画
	private void moveAmin(final View moveView, int moveStarY, int moveEndY) {
		ObjectAnimator.ofFloat(moveView, "translationY", moveStarY, moveEndY)
				.setDuration(MOVING_TIME).start();
	}

	//简单的适配器
	class Madapter extends BaseAdapter {
		@Override
		public int getCount() {
			return 100;
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			TextView textView = new TextView(getApplicationContext());
			textView.setText("测试item" + position);
			textView.setTextSize(20);
			textView.setTextColor(0xff333333);
			return textView;
		}

	}

}
有大神知道知乎的实现求指点



猜你喜欢

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