通过 属性动画移动头尾布局, 并且设置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 实现类似知乎 上推隐藏头尾 下拉出现头尾的Demo相关推荐

  1. Android开发之QQ空间效果(QQ空间下拉图片放大,松手后回弹)

    Android开发之QQ空间效果(QQ空间下拉图片放大,松手后回弹) 腾讯QQ空间的下拉图片放大,松手后回弹的效果带来的视觉差异效果让许多移动开发者心动不已,经本人一段时间的研究,终于实现了该视差效果 ...

  2. ios 上滑隐藏导航下拉显示导航栏实现

    为了最大限度的利用手机屏幕,出现了上滑隐藏导航下拉显示导航栏. 先看看效果(代码:http://download.csdn.net/detail/gx_wqm/9771247), 把代码跑一下看一下是 ...

  3. vue导航栏滚动下拉条上拉隐藏,下拉显示切换样式变化(源码)

    目录 案例1 源码如下 效果如下 案例2 源码如下 效果如下 最后 案例1 源码如下 navBar内容,上拉显示navBar,下拉隐藏navBar,固定在顶部,样式切换 <template> ...

  4. (翻译)用户的输入已知时,不要使用下拉菜单

      在字段中使用下拉菜单之前应先自问,用户不看下拉项是否知道该填什么内容?如果答案为是,则不要使用下拉菜单,而应采用自动完成方式.   如果用户知道要输入的内容,就没必要让他们在一组下拉项中滚动查看, ...

  5. Android ListView 疯狂之旅 之 《自定义下拉刷新功能的ListView》

    效果图: 一 首先创建一个类,继承ListView,编写其构造方法 public class RefreshListView extends ListView {public RefreshListV ...

  6. Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout

    SwipeRefreshLayout 下拉刷新布局SwipeRefreshLayout是Android又一与时俱进的控件,顾名思义它随着用户手势向下滑动就会触发刷新操作.从实际的下拉效果来看,Swip ...

  7. android多个下拉控件,Android实现支持所有View的通用的下拉刷新控件

    下拉刷新对于一个app来说是必不可少的一个功能,在早期大多数使用的是chrisbanes的PullToRefresh,或是修改自该框架的其他库.而到现在已经有了更多的选择,github上还是有很多体验 ...

  8. Android 博客园客户端 (八) 下拉刷新、分页,AsyncTask

    一直以来,无论是博客.新闻.还是推荐用户列表.只能加载固定的数量,也没有刷新功能. 为了实现这个功能,也试过很多第三方的开源控件,如PullToRefreshListVie等.无意中发现了Google ...

  9. android 加载更多动画效果,Android实践之带加载效果的下拉刷新上拉加载更多

    前言 之前写的一个LoadingBar,这次把LoadingBar加到下拉刷新的头部.从头写一个下拉刷新,附赠上拉加载更多.下面话不多说了,来一起看看详细的介绍吧. 效果图: 实现过程 首先是自定义属 ...

最新文章

  1. Qcon大会归来(r12笔记第36天)
  2. Java RMI(2):项目中使用RMI
  3. 牛客练习赛46 C 华华跟奕奕玩游戏 (期望,概率)(详解)
  4. matlab线性平面映射求通项_代数学发展史: 线性空间
  5. Xor HDU - 6899
  6. mysql limit不要1_神坑!MySQL中order by与limit不要一起用!
  7. Google+ 团队的 Android UI 测试
  8. 手把手教你搭建FastDFS集群(上)
  9. 清华学姐教你如何用python处理excel数据
  10. 动态视频壁纸多功能工具箱微信小程序源码,支持外卖CPS和流量主
  11. echarts设置主标题和副标题样式
  12. C#System.Text.RegularExpressions.Regex使用
  13. 智能测试实践之路-UI缺陷检测
  14. 【HUST】网络攻防实践|5_二进制文件补丁技术|实验二 getshell
  15. raid, scsi_host pics
  16. void*的用法【转】
  17. 程序员的爱情 第十七章
  18. 中文分词多领域语料库
  19. 基于v$lock.block及request及dba_waiters或dba_blockers学习lock锁系列七
  20. 显示单月的日历c语言编程,显示单月的日历的C程序

热门文章

  1. TCP三次握手以及UDP相关知识
  2. 什么是外汇托管?外汇托管靠不靠谱?外汇托管适合的投资者类型。
  3. linux 安装绿色版的tomcat
  4. OpenGL3D迷宫场景设计
  5. 2016百度之星 - 资格赛(Astar Round1)Problem A
  6. synaptics.exe,感觉电脑是中了这个病毒,c盘一下子爆满,然后删了一次,但是治标不治本,反反复复,开机时候出现这个弹窗,所以要咋处理才能彻底解决,不知道有没有可以回复下,万分感谢
  7. CCSP Official (ISC)2 Practice Tests 免积分下载
  8. 【程序设计】文件的打包与压缩
  9. Alink在线学习(Online Learning)之Java示例【三】
  10. Golang 基础之基础语法梳理 (一)