您的位置:首页 > 移动开发 > Android开发

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

2016-07-28 11:16 537 查看


通过 属性动画移动头尾布局, 并且设置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;
}

}

}

有大神知道知乎的实现求指点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: