ListView上滑和下滑,显示和隐藏Toolbar的实现方法

ListView上滑和下滑,显示和隐藏Toolbar的实现方法,第1张

概述1.准备Toolbar先隐藏系统自带的actionbar,在AndroidManifest.xml文件<application>标签中:

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的实现方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1143139.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存