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; } } }
有大神知道知乎的实现求指点
相关文章推荐
- android实现点击屏幕其他地方popupwindow消失
- Android焦点控制
- Android ListView的OnItemClickListener详解
- Android Studio 使用技巧汇总
- Android如何设置图标字体 IconFont(HTML图标)
- 安卓开发中的那点事
- Android中常见的内存溢出错误
- Android中AsyncTask的使用与源码分析
- android Studio快捷方式
- 基于Android的百度地图开发
- Android编程之ListView分页加载数据
- Error:(20, 45) 错误: <匿名com.example.administrator.androidthread.MainActivity$1>不是抽象的, 并且未覆盖Handler中的抽象
- android设置在ListView中让TextView滚动
- 报错:07-28 11:02:19.121: E/AndroidRuntime(5867): Caused by: java.lang.ArrayIndexOutOfBoundsException:
- Android坐标详谈
- Android 带着用户名的SharedPreferences
- Android4.4 、Android 5.0 全透明状态栏效果
- android开发之一如何升级SDK
- Android判断非系统应用
- Android多种多渠道打包工具对比