1.准备Toolbar
先隐藏系统自带的actionbar,在AndroidManifest.xml文件
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
(注意此处的Activity应继承AppCompatActivity)
再在布局文件中添加Toolbar,activity_main.xml文件中:
<&#63;xml version="1.0" encoding="utf-8"&#63;>
现在布局中就添加了一个Toolbar和一个ListView.
2.Activity
package com.example.listview_unit4_1; import android.animation.ObjectAnimator; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView listView; private ListlistViewData;//数据源 private ArrayAdapter adapter; private Toolbar toolbar; private int mTouchSlop;//系统认为的最小滑动距离 private float mFirstY;//用户首次触摸的Y坐标 private float mLastY;//用户滑动结束时Y坐标 private ObjectAnimator mAnimator;//将控件与动画联系起来的类(可以使指定的控件,实现指定的动画效果) private boolean mShow;//toolbar是否显示 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); //初始化数据源 initData(); listView = (ListView) findViewById(R.id.list_view); //为ListView增加一个HeadView(避免第一个Item被toolbar遮挡) //abc_action_bar_default_height_material属性获取系统actionBar的高度 View headView = new View(this); headView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, (int)getResources().getDimension(R.dimen.abc_action_bar_default_height_material))); listView.addHeaderView(headView); //获取系统定义的最低滑动距离 mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop(); adapter = new ArrayAdapter (this, R.layout.support_simple_spinner_dropdown_item, listViewData); listView.setAdapter(adapter); //为ListView设置触摸事件监听 listView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: mFirstY = event.getY();//getY获取的是相对于View的坐标,getRawY获取的是相对于屏幕的坐标 break; case MotionEvent.ACTION_MOVE: mLastY = event.getY(); if(mLastY - mFirstY > mTouchSlop){//手指向下滑动,显示toolbar if(!mShow){ Log.i("tag", "mLastY_手指下滑="+mLastY); toolbarAnim(0);//显示 mShow = !mShow; } }else if(mFirstY - mLastY > mTouchSlop){//手指向上滑动,隐藏toolbar if(mShow){ Log.i("tag", "mLastY_手指上滑="+mLastY); toolbarAnim(1);//隐藏 mShow = !mShow; } } break; default:break; } return false;//一般返回false,提交给上级 } }); } public void toolbarAnim(int flag){ if(mAnimator != null && mAnimator.isRunning()){ mAnimator.cancel(); } if(flag == 0){ Log.i("tag", "手指下滑,》》》》》》》显示"); mAnimator = ObjectAnimator.ofFloat(toolbar, "translationY", toolbar.getTranslationY(), 0); }else if(flag == 1){ Log.i("tag", "手指上滑,》》》》》》》隐藏"); mAnimator = ObjectAnimator.ofFloat(toolbar, "translationY", toolbar.getTranslationY(), -toolbar.getHeight()); } mAnimator.start();//开始动画 } /** * 初始化ListView的数据源 */ public void initData(){ listViewData = new ArrayList<>(); String s; for(int i = 0; i <20; i ++){ s = ""+i; listViewData.add(s); } } }
(1)为ListView添加了一个HeadView高度与Toolbar高度一致,避免在 RelativeLayout中Toolbar遮挡ListView第一项;
(2)设置ListView的触摸监听事件:
当用户首次按下(MotionEvent.ACTION_DOWN),记录开始的Y坐标;在用户滑动的过程中(MotionEvent.ACTION_MOVE),记录用户当前的手指的Y坐标;两者比较可以判断出用户手指滑动方向;
(3)使用 ObjectAnimator类控制Toolbar的动画效果:
实例化mAnimator:
//第一个参数用于指定这个动画要操作的是哪个控件 //第二个参数用于指定这个动画要操作这个控件的哪个属性 //第三个参数是可变长参数,指这个属性值是从多少变到多少 mAnimator = ObjectAnimator.ofFloat(toolbar, "translationY", toolbar.getTranslationY(), 0); mAnimator = ObjectAnimator.ofFloat(toolbar, "translationY", toolbar.getTranslationY(), -toolbar.getHeight());
(4)使用一个布尔值标识当前Toolbar是否显示:
如果不是这样做,那用户在不断滑动过程中,会不断的触发onTouch方法,不断地执行toolbarAnim方法,导致滑动效果很不流畅(从Log中可以发现这一点)
实现效果:
以上这篇ListView上滑和下滑,显示和隐藏Toolbar的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。