专栏首页kevindroidAndroid 点击屏幕其他位置隐藏Floating Action Button

Android 点击屏幕其他位置隐藏Floating Action Button

功能要求

当用户点击fab的时候,屏幕上的其他区域应该是不可点击的,如果用户点击其他区域,那么就应该收缩fab回到初始状态。 观察一下其他应用:

发现实质点击按钮之后启动了新的fragment,并将背景设置为半透明。

具体实现

首先,随便找一个fab的开源库:

compile 'net.i2p.android.ext:floatingactionbutton:1.9.0'

然后,activity里的fab的作用是启动一个新的fragment:

public class MainActivity extends AppCompatActivity {

    private FloatingActionsMenu fab_menu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fab_menu = (FloatingActionsMenu) findViewById(R.id.fab_activity);
        fab_menu.setOnFloatingActionsMenuUpdateListener(new FloatingActionsMenu.OnFloatingActionsMenuUpdateListener() {
            @Override
            public void onMenuExpanded() {
                getSupportFragmentManager()
                        .beginTransaction()
                        .add(android.R.id.content, new FabFragment(), "fragment_fab")
                        .addToBackStack("fragment:fab")
                        .commit();
                //点击之后回复原状,这样在从fragment返回之后仍然是原来的样子
                fab_menu.collapse();
            }

            @Override
            public void onMenuCollapsed() {

            }
        });
    }
}

为了实现点击屏幕其他地方隐藏fab,需要实现onTouchListener接口中的onTouch()方法,将返回值改为true,这样就说明成功处理了触摸事件,会结束当前的fragment。

public class FabFragment extends Fragment implements View.OnClickListener, View.OnTouchListener {
    private FloatingActionButton fab_commmon;
    private FloatingActionButton fab_help;
    private FloatingActionsMenu fab;

    public FabFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_blank, container, false);
        v.setOnClickListener(this);
        initView(v);
        initEvent();
        return v;
    }

    private void initView(View v) {
        fab = (FloatingActionsMenu) v.findViewById(R.id.fab);
        fab_commmon = (FloatingActionButton) v.findViewById(R.id.action_a);
        fab_help = (FloatingActionButton) v.findViewById(R.id.action_b);
        fab.expand();
    }

    private void initEvent() {
        fab_commmon.setOnClickListener(this);
        fab_help.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.root:
                getActivity().getSupportFragmentManager().popBackStack();
                break;
            case R.id.action_a:
                //执行某些操作
                getActivity().getSupportFragmentManager().popBackStack();
                break;
            case R.id.action_b:
                //执行某些操作
                getActivity().getSupportFragmentManager().popBackStack();
                break;
        }

    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return true;
    }
}

这时实现后的效果:

源码下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • leetcode 93. Restore IP Addresses

    用户1665735
  • JVM学习笔记——垃圾收集器与内存分配策略(1)

    上一篇文章介绍了java运行时内存的各个区域,其中虚拟机栈,程序计数器,本地方法栈三个区域随线程而生,随线程而灭。栈中的栈帧随着方法的进入和退出有条不紊的执行着...

    用户1665735
  • LeetCode171 Excel Sheet Column Number

    Given a column title as appear in an Excel sheet, return its corresponding colum...

    用户1665735
  • 2020年---最新「前端学习体系与前端概述」(面经必读)

    最简化工具有 chrome浏览器、 editplus编辑器、pxCook量图器。后续随着课程推进,会慢慢介绍各种辅助工具,在这里就罗列,以免干扰新手小白。

    用户5827212
  • 【GAN优化】详解SNGAN(频谱归一化GAN)

    今天将和大家一起学习具有很高知名度的SNGAN。之前提出的WGAN虽然性能优越,但是留下一个难以解决的1-Lipschitz问题,SNGAN便是解决该问题的一个...

    用户1508658
  • .Net中Finalize()和Dispose()有什么区别?

    程序你好
  • Pown-Duct:一款功能强大的盲注攻击检测工具

    今天给大家介绍的是一款名叫Pown-Duct的工具,该工具基于DNS测信道实现其功能,广大研究人员可以利用Pown-Duct来有效检测盲注攻击向量。

    FB客服
  • Docker 多主机管理

    1、其中一台安装docker-machine,并安装bash completion script

    用户5760343
  • 微笑不可怕,谁假谁尴尬

    在我们成年人的社交生活所展现的情感中,笑是最常见的一种,每10分钟谈话中,人们平均会笑5次。尽管笑有职业假笑和真诚的笑两种区别,但它仍不失为我们人际交往中最行之...

    AiTechYun
  • RPA:破解企业增效降本之永恒命题

    近年,随着物联网、云计算、机器人流程自动化(RPA)、人工智能(AI)等新技术的发展,全球数字化浪潮已催生出了数字经济时代。

    蕉黄

扫码关注云+社区

领取腾讯云代金券