小编给大家分享一下ListView如何实现显示和隐藏Toolbar功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1.准备Toolbar
先隐藏系统自带的actionbar,在AndroidManifest.xml文件<application>标签中:
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
(注意此处的Activity应继承AppCompatActivity)
再在布局文件中添加Toolbar,activity_main.xml文件中:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.listview_unit4_1.MainActivity"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent"/> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary"/> </RelativeLayout>
现在布局中就添加了一个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 List<String> listViewData;//数据源 private ArrayAdapter<String> 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<String>(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功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。