广告
返回顶部
首页 > 资讯 > 精选 >怎么在Android中利用FloatingActionButton实现显示与隐藏
  • 531
分享到

怎么在Android中利用FloatingActionButton实现显示与隐藏

androidfloatingactionbutton 2023-05-30 19:05:00 531人浏览 独家记忆
摘要

本篇文章为大家展示了怎么在Android中利用FloatingActionButton实现显示与隐藏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。FloatingActionButton简介Floa

本篇文章为大家展示了怎么在Android中利用FloatingActionButton实现显示与隐藏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

FloatingActionButton简介

FloatingActionButton(FAB) 是Android 5.0 新特性——Material Design 中的一个控件,是一种悬浮的按钮,并且是 ImageView 的子类,因此它具备ImageView的全部属性。一般FloatingActionButton 结合 CoordinatorLayout 使用,即可实现悬浮在任意控件的任意位置。

实现方法(一)

监听页面列表(RecyclerView)的滑动回调事件,通过回调来决定Toolbar和FAB的显示和隐藏。

1)封装RecyclerView.OnScrollListener,封装的原因是为了让Activity显得没那么臃肿。

public class MyScrollListener extends RecyclerView.OnScrollListener {  private HideandShowListener mHideAndShowListener;  private static final int THRESHOLD = 20;  private int distance = 0;  private boolean visible = true;  public MyScrollListener(HideAndShowListener hideAndShowListener) {    mHideAndShowListener = hideAndShowListener;  }  @Override  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {    super.onScrolled(recyclerView, dx, dy);        Log.i("tag","dy--->"+dy);    if (distance > THRESHOLD && visible) {      //隐藏动画      visible = false;      mHideAndShowListener.hide();      distance = 0;    } else if (distance < -20 && !visible) {      //显示动画      visible = true;      mHideAndShowListener.show();      distance = 0;    }    if (visible && dy > 0 || (!visible && dy < 0)) {      distance += dy;    }  }  public interface HideAndShowListener {    void hide();    void show();  }}

主要在onScrolled方法计算判断FAB的显示和隐藏,然后设置HideAndShowListener回调,调用相应的显示和隐藏的方法即可。

2)RecyclerView添加OnScrollListener监听并且设置HideAndShowListener回调,通过HideAndShowListener的hide()和show()来设置FAB的隐藏和显示。

public class FABActivity extends AppCompatActivity {  private RecyclerView mRecyclerView;  private FloatingActionButton fab;  private Toolbar toolbar;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_fab);    toolbar = (Toolbar) findViewById(R.id.toolbar);    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);    setSupportActionBar(toolbar);    setTitle("FAB");    fab = (FloatingActionButton) findViewById(R.id.fab);    fab.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {        Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)            .setAction("Action", null).show();      }    });    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));    List<String> list = new ArrayList<>();    for (int i = 0; i < 60; i++) {      list.add("Item"+i);    }    FabRecyclerAdapter adapter = new FabRecyclerAdapter(list);    mRecyclerView.setAdapter(adapter);    setListener();  }    private void setListener() {    mRecyclerView.addOnScrollListener(new MyScrollListener(new MyScrollListener.HideAndShowListener() {      @Override      public void hide() {        // 隐藏动画--属性动画        toolbar.animate().translationY(-toolbar.getHeight()).setInterpolator(new AccelerateInterpolator(3));        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) fab.getLayoutParams();        fab.animate().translationY(fab.getHeight() + layoutParams.bottomMargin).setInterpolator(new AccelerateInterpolator(3));      }      @Override      public void show() {        // 显示动画--属性动画        toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(3));        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) fab.getLayoutParams();        fab.animate().translationY(0).setInterpolator(new DecelerateInterpolator(3));      }    }));  }}

在hide()和show()方法中,设置了FAB的隐藏和显示的动画。

接下来给出RecyclerView的Adapter

public class FabRecyclerAdapter extends RecyclerView.Adapter {  private List<String> list;  public FabRecyclerAdapter(List<String> list) {    this.list = list;  }  @Override  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);    return new MyViewHolder(view);  }  @Override  public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {    String str = list.get(position);    MyViewHolder hd = (MyViewHolder) holder;    hd.mButton.setText(str);  }  @Override  public int getItemCount() {    if (list != null) {      return list.size();    }    return 0;  }  class MyViewHolder extends RecyclerView.ViewHolder {    private Button mButton;    public MyViewHolder(View itemView) {      super(itemView);      mButton = (Button) itemView.findViewById(R.id.btn);    }  }}

MyViewHolder的xml文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="Http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:orientation="vertical" >  <Button    android:id="@+id/btn"    android:layout_margin="5dp"    android:layout_width="match_parent"    android:layout_height="wrap_content"    /></LinearLayout>

Activity的布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.main.fab.FABActivity">  <android.support.v7.widget.RecyclerView    android:id="@+id/recyclerview"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:clipChildren="false"    android:clipToPadding="false"    android:paddingTop="?attr/actionBarSize"    />  <android.support.v7.widget.Toolbar    android:id="@+id/toolbar"    android:layout_width="match_parent"    android:layout_height="?attr/actionBarSize"    android:background="?attr/colorPrimary"/>  <android.support.design.widget.FloatingActionButton    android:id="@+id/fab"    android:layout_width="58dp"    android:layout_height="58dp"    android:layout_alignParentBottom="true"    android:layout_alignParentRight="true"    android:layout_margin="16dp"    /></RelativeLayout>

以上就是实现Toolbar和FloatingActionButton根据页面列表的上下滑动来隐藏和显示方法一的这个过程。

实现方法(二)

通过封装CoordinatorLayout.Behavior,通过它的onNestedScroll方法计算判断显示和隐藏,同时给Toolbar和FAB设置app:layout_behavior,该属性指定使用封装的CoordinatorLayout.Behavior即可。

1)封装CoordinatorLayout.Behavior

public class FabBehavior extends CoordinatorLayout.Behavior {  public FabBehavior() {  }  public FabBehavior(Context context, AttributeSet attrs) {    super(context, attrs);  }  private boolean visible = true;//是否可见  @Override  public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {    //被观察者(RecyclerView)发生滑动的开始的时候回调的    //nestedScrollAxes:滑动关联轴,现在只关心垂直的滑动。    return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild,        target, nestedScrollAxes);  }  @Override  public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {    super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);    //被观察者滑动的时候回调的    if (dyConsumed > 0 && visible) {      //show      visible = false;      onHide(child);    } else if (dyConsumed < 0) {      //hide      visible = true;      onShow(child);    }  }  public void onHide(View view) {    // 隐藏动画--属性动画    if (view instanceof Toolbar){      ViewCompat.animate(view).translationY(-(view.getHeight() * 2)).setInterpolator(new AccelerateInterpolator(3));    }else if (view instanceof FloatingActionButton){      ViewCompat.animate(view).translationY(view.getHeight() * 2).setInterpolator(new AccelerateInterpolator(3));    }else{    }  }  public void onShow(View view) {    // 显示动画--属性动画    ViewCompat.animate(view).translationY(0).setInterpolator(new DecelerateInterpolator(3));  }}

onStartNestedScroll:列表(RecyclerView)刚开始滑动时候会回调该方法,需要在方法内设置滑动关联轴。这里只需要垂直方向上的滑动即可。

onNestedScroll:滑动的时候不断的回调该方法,通过dyConsumed来判断是上滑还是下滑。

2)Toolbar和FAB设置app:layout_behavior

<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout  xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.main.behavior.BehaviorActivity">  <android.support.v7.widget.RecyclerView    android:id="@+id/recyclerview"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:clipChildren="false"    android:clipToPadding="false"    android:paddingTop="?attr/actionBarSize"    />  <android.support.v7.widget.Toolbar    android:id="@+id/toolbar"    android:layout_width="match_parent"    android:layout_height="?attr/actionBarSize"    android:background="?attr/colorPrimary"    app:layout_behavior="com.main.behavior.FabBehavior"/>  <android.support.design.widget.FloatingActionButton    android:id="@+id/fab"    android:layout_width="58dp"    android:layout_height="58dp"    android:layout_gravity="bottom|end"    android:layout_margin="16dp"    android:src="@mipmap/ic_launcher"    app:layout_behavior="com.main.behavior.FabBehavior"/></android.support.design.widget.CoordinatorLayout>

在布局文件中给Toolbar和FAB直接设置app:layout_behavior即可。

BehaviorActivity.java

public class BehaviorActivity extends AppCompatActivity {  private RecyclerView mRecyclerView;  private Toolbar toolbar;  private FloatingActionButton fab;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_behavior);    mRecyclerView = (RecyclerView)findViewById(R.id.recyclerview);    fab = (FloatingActionButton)findViewById(R.id.fab);    toolbar = (Toolbar)findViewById(R.id.toolbar);    setSupportActionBar(toolbar);    setTitle("FAB");    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));    List<String> list = new ArrayList<>();    for (int i = 0; i < 60; i++) {      list.add("Item"+i);    }    FabRecyclerAdapter adapter = new FabRecyclerAdapter(list);    mRecyclerView.setAdapter(adapter);  }}

上述内容就是怎么在Android中利用FloatingActionButton实现显示与隐藏,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么在Android中利用FloatingActionButton实现显示与隐藏

本文链接: https://www.lsjlt.com/news/220673.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Android中利用FloatingActionButton实现显示与隐藏
    本篇文章为大家展示了怎么在Android中利用FloatingActionButton实现显示与隐藏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。FloatingActionButton简介Floa...
    99+
    2023-05-30
    android floatingactionbutton
  • Android 中怎么利用EditText实现密码的隐藏和显示功能
    这篇文章给大家介绍Android 中怎么利用EditText实现密码的隐藏和显示功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android EditText密码的隐藏和显示功能实现效果图:实现代码:首先在xml里...
    99+
    2023-05-30
    android edittext
  • 怎么在css中显示与隐藏元素
    本篇文章给大家分享的是有关怎么在css中显示与隐藏元素,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。display对于元素显隐来说,最常见就是display:none | di...
    99+
    2023-06-08
  • Android应用中怎么实现一个密码显示与隐藏功能
    Android应用中怎么实现一个密码显示与隐藏功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现代码如下:<&#63;xml version="1....
    99+
    2023-05-31
    android roi
  • Android应用中怎么实现一个隐藏与显示键盘功能
    Android应用中怎么实现一个隐藏与显示键盘功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。隐藏键盘: public static void hideSoftInp...
    99+
    2023-05-31
    android roi
  • Android项目中怎么显示与隐藏软键盘
    今天就跟大家聊聊有关Android项目中怎么显示与隐藏软键盘,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。代码如下:import android.app.Activity;impor...
    99+
    2023-05-31
    android roi 目中
  • Android应用中怎么动态显示与隐藏状态栏
    这篇文章给大家介绍Android应用中怎么动态显示与隐藏状态栏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是沉浸式?先来分析一下叫错的原因吧,之所以很多人会叫错,是因为根本就不了解沉浸式是什么意思,然后就人云亦云...
    99+
    2023-05-31
    android roi
  • 怎么利用vue控制元素的显示与隐藏
    这篇文章主要介绍了怎么利用vue控制元素的显示与隐藏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么利用vue控制元素的显示与隐藏文章都会有所收获,下面我们一起来看看吧。 方法:使用 v-...
    99+
    2023-07-04
  • Android怎么实现显示和隐藏密码功能
    这篇文章主要介绍“Android怎么实现显示和隐藏密码功能”,在日常操作中,相信很多人在Android怎么实现显示和隐藏密码功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android怎么实现显示和隐藏密...
    99+
    2023-07-02
  • Android开发中怎么使用Dialog显示与隐藏软键盘
    Android开发中怎么使用Dialog显示与隐藏软键盘?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。效果图:2.实现过程先说说最开始的实现方法:// 显示Dialogdial...
    99+
    2023-05-31
    android dialog roi
  • Android开发中如何使用PopupWindow实现隐藏与显示功能
    这篇文章给大家介绍Android开发中如何使用PopupWindow实现隐藏与显示功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、PopupWindow的隐藏final PopupWindow window = ...
    99+
    2023-05-31
    android popupwindow roi
  • 如何在Android在使用TextView实现一个显示与隐藏全文功能
    如何在Android在使用TextView实现一个显示与隐藏全文功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。参数定义<declare-styleab...
    99+
    2023-05-31
    android textview roi
  • jquery怎么实现点击按钮显示与隐藏效果
    本文小编为大家详细介绍“jquery怎么实现点击按钮显示与隐藏效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery怎么实现点击按钮显示与隐藏效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先来看实...
    99+
    2023-06-30
  • 怎么使用vue实现简单的点击显示与隐藏效果
    本文小编为大家详细介绍“怎么使用vue实现简单的点击显示与隐藏效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用vue实现简单的点击显示与隐藏效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。目前前端框...
    99+
    2023-07-04
  • 怎么通过display或visibility实现HTML元素的显示与隐藏
    本篇内容介绍了“怎么通过display或visibility实现HTML元素的显示与隐藏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望...
    99+
    2022-10-19
  • 怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果
    今天就跟大家聊聊有关怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先是这个最小的Tag:这个T...
    99+
    2023-05-31
    android floatingbutton roi
  • Electron怎么实现应用显示隐藏时展示动画效果
    今天小编给大家分享一下Electron怎么实现应用显示隐藏时展示动画效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。最终效...
    99+
    2023-06-30
  • php页面怎么用JavaScript实现点击按钮显示隐藏
    这篇文章主要讲解了“php页面怎么用JavaScript实现点击按钮显示隐藏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php页面怎么用JavaScript实现点击按钮显示隐藏”吧!第一步...
    99+
    2023-07-05
  • 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法
    1、//隐藏软键盘    ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE))...
    99+
    2022-06-06
    自动 方法 软键盘 Android
  • 怎么用vue组件实现弹出框点击显示隐藏效果
    本篇内容介绍了“怎么用vue组件实现弹出框点击显示隐藏效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下1.在当前页面中(主页面)&...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作