布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent">      <ListView          android:id="@+id/main_list_view"          android:layout_width="fill_parent"          android:layout_height="fill_parent"          />      <android.support.v7.widget.Toolbar          android:id="@+id/main_bar"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:background="@color/std_color_A"          />  </RelativeLayout>

代码

public class MainActivity extends BaseActivity{        private static final String TAG = MainActivity.class.getSimpleName();        private Toolbar mMainToolbar = null;      private ListView mMainListView = null;        private float mStartY = 0, mLastY = 0, mLastDeltaY;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);            mMainToolbar = (Toolbar)this.findViewById(R.id.main_bar);          this.setSupportActionBar(mMainToolbar);            mMainListView = (ListView)this.findViewById(R.id.main_list_view);          final View header = LayoutInflater.from(this).inflate(R.layout.layout_header, null);//这个header高度要与toolbar相同          mMainListView.addHeaderView(header);          mMainListView.setAdapter(new AudioAdapter(this));              mMainListView.setOnTouchListener(new View.OnTouchListener() {              @Override              public boolean onTouch(View v, MotionEvent event) {                  final float y = event.getY();                  float translationY = mMainToolbar.getTranslationY();                  switch (event.getAction()) {                      case MotionEvent.ACTION_DOWN:                          mStartY = y;                          mLastY = mStartY;                          break;                      case MotionEvent.ACTION_MOVE:                          float mDeltaY = y - mLastY;                            float newTansY = translationY + mDeltaY;                          if (newTansY <= 0 && newTansY >= -mMainToolbar.getHeight()) {                              mMainToolbar.setTranslationY(newTansY);                          }                          mLastY = y;                          mLastDeltaY = mDeltaY;                          break;                      case MotionEvent.ACTION_UP:                          ObjectAnimator animator = null;                          Log.d(TAG, "mLastDeltaY=" + mLastDeltaY);                          if (mLastDeltaY < 0 && mMainListView.getFirstVisiblePosition() > 1) {                              Log.v(TAG, "listView.first=" + mMainListView.getFirstVisiblePosition());                              animator = ObjectAnimator.ofFloat(mMainToolbar, "translationY", mMainToolbar.getTranslationY(), -mMainToolbar.getHeight());                          } else {                              animator = ObjectAnimator.ofFloat(mMainToolbar, "translationY", mMainToolbar.getTranslationY(), 0);                          }                          animator.setDuration(100);                          animator.start();                          animator.setInterpolator(AnimationUtils.loadInterpolator(MainActivity.this, android.R.interpolator.linear));                          break;                  }                  return false;              }          });      }  }

先用我们自己的Toolbar替换原来的ActionBar,注意,在你的AppTheme中,windowActionbar这一项要设置为false才能用我们自己的去替换原来的,不然运行会报错,然后给Listview一个与Toolbar等高的headerView。然后再设置Touch事件的监听,在onTouch方法的ACTION_MOVE分支中,我们计算出本次触发move事件与上次触发move或者down事件时候,我们的触发点的位置变化量-mDeltaY,然后计算出一个相应的translationY,经过与Toolbar高度比较,判断出新的translationY是否合法,合法,则用setTranslationY方法,给Toolbar赋值。触发UP事件:当触发了UP事件后,就要,我们就要用一个动画,来过度一下。先判断滑动方向,方向向上,则向上滑动,向下,则向下滑动。

我是天王盖地虎的分割线

参考:http://blog.csdn.net/boybeak/article/details/41410113

更多相关文章

  1. Android高手进阶教程(十)之----Android(安卓)PopupWindow的使用
  2. android switch button 报 java.lang.NullPointerException: Att
  3. Android事件分发机制——ViewGroup(二)
  4. Android(安卓)Touch事件
  5. ScrollView嵌套RecyclerView冲突解决
  6. Android(安卓)Jetpack之Lifecycle的源码分析
  7. android触屏手势识别全解析
  8. Android(安卓)ViewPager 左右滑动-3
  9. 【Android】PA4D_CH6 使用Internat资源

随机推荐

  1. Android(安卓)常用ADB命令汇总!!! -- 持
  2. Android(2017-2018)BAT面试题整理(java篇,
  3. Animator记录一次属性动画实现的逐渐出现
  4. Android中 备份短信 还原短信
  5. Android(安卓)kotlin上传头像实现
  6. Android设备管理器漏洞
  7. android背景选择器selector用法汇总
  8. 使用 IntelliJ Debug Android(安卓)源码
  9. Android:控件GridView的使用
  10. 【Android(安卓)开发】:Android五种布局的