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,-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,0);mAnimator = ObjectAnimator.offloat(toolbar,-toolbar.getHeight());
(4)使用一个布尔值标识当前Toolbar是否显示:
如果不是这样做,那用户在不断滑动过程中,会不断的触发ontouch方法,不断地执行toolbaranim方法,导致滑动效果很不流畅(从Log中可以发现这一点)
实现效果:
以上这篇ListVIEw上滑和下滑,显示和隐藏Toolbar的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的ListView上滑和下滑,显示和隐藏Toolbar的实现方法全部内容,希望文章能够帮你解决ListView上滑和下滑,显示和隐藏Toolbar的实现方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)