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 条评论
登录 后参与评论

相关文章

来自专栏Android小菜鸡

popupWindow的封装与学习

  本篇主要富含了对PopupWindow的封装,实现动画弹窗的例子。可用于相册选择、点赞等等。同时封装使用了建造者模式,对于补间动画的运用同样有较高的学习价值...

581
来自专栏Android Note

Android StatusBar 透明化方法

781
来自专栏Android干货

Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow

2776
来自专栏Sorrower的专栏

界面无小事(七):使用代码动态增删布局

583
来自专栏Android干货

关于安卓开发实现进度条对话框

2967
来自专栏向治洪

仿iphone快速导航悬浮球

用过iphone的朋友都知道,iPhone有个圆球辅助工具,它漂浮在你的手机屏幕(在任何APP之上),你可以将它移动到任何地方,它叫做AssistiveTouc...

2218
来自专栏Android干货

浅谈SnackBar(Toast大兄弟)

2494
来自专栏非著名程序员

自定义带图片和文字的ImageTextButton

今天我们来讲一下有关自定义控件的问题,今天讲的这篇是从布局自定义开始的,难度不大,一看就明白,估计有的同学或者开发者看了说,这种方式多此一举,但是小编我不这么认...

1869
来自专栏Android干货

安卓开发_WebView如何在Fragment中使用

2766
来自专栏CodingBlock

Android开发必知--自定义Toast提示

  开发过Android的童鞋都会遇到一个问题,就是在打印Toast提示时,如果短时间内触发多个提示,就会造成Toast不停的重复出现,直到被触发的Toast全...

2195

扫码关注云+社区