Android 摇一摇开发工具 Shaker

作者: lovejjfg | 来源:发表于2018-06-05 20:01 被阅读46次

    17年2月份,写过一篇 Android开发小工具-摇一摇显示当前页面信息
    ,这个是当时根据项目里面出现的情况临时凑合上线使用的。这段时间回顾过来,觉得应该把这个坑好好填一下。

    还是先说使用场景,当你的页面已经很多很多,开发迭代的程序员也来来去去换了好几波。这个时候,怎么快速定位到需要修改的页面呢?

    当然,你全局搜索指定变量,通过变量拿到布局或者指定就找到对应写死的页面也是可行的。但是这个如果碰到重复使用的布局或者变量时,并不能做到一步到位。

    那么,摇一摇,我觉得是最简单,效率最高的实现方式。一摇,当前 Activity 以及其包含的 Fragment 都一目了然,实际使用告诉我,这个功能开发调试使用起来真的不错。

    基于上篇文章,这里对之前的代码做了进一步抽取和封装,进一步扩展一些方法。

    WechatIMG291.jpeg

    主要就三个类,ShakerHelper Shaker ShakerCallback

    一般使用方式

    Application 中完成初始化,最简单的是:

    ShakerHelper.init(true)
    

    然后在BaseActivity中得到初始化Shaker,并绑定相关监听。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        shaker = ShakerHelper.instance(this);       
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        shaker.onResume();
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        shaker.onStop();
    }
    

    到这里,最基本的使用就搞定啦,接下来说说对应支持的新功能。这些新功能都是在 ShakerCallback 里实现。

    /**
     * When you'd like to ignore some fragments to show in the shaker dialog, you should call this method.
     *
     * @return the ignore list of Fragment.
     */
    @Nullable
    List<Class> ignoreFragments();
    
    /**
     * If you don't want to some Activities have the shaker ability,you may call this method to add them to the
     * disable list.
     *
     * @return the disable show shaker dialog Activities.
     */
    @Nullable
    List<Class> disableActivities();
    
    /**
     * If you'd like to have you own shaker dialog,you should call this method to add you layout resource id.
     *
     * @return the specified layout resource.
     */
    @LayoutRes
    int initHintViewLayout();
    
    /**
     * When your specified view is inflated to the dialog,this method will callback. so that you can dell with the
     * views.
     *
     * @param dialog the shaker dialog
     * @param view the view inflated by method {@link #initHintViewLayout()}
     */
    
    void onHintViewInflated(DialogInterface dialog, View view);
    
    /**
     * When the Sensor result is changed,this method will callback.
     *
     * @param event the Sensor event
     * @return return true if you want to show the shaker dialog, otherwise not.
     */
    boolean onSenseChanged(SensorEvent event);
    
    /**
     * If you'd like to handle the shaker dialog content by yourself, you may need to add your
     * {@link FragmentsHandler} and call this method to add to {@link ShakerHelper}
     *
     * @return yourself list of {@link FragmentsHandler}
     */
    
    List<FragmentsHandler> fragmentHandlers();
    
    /**
     * When shaker dialog is dismiss,this method will callback,so that you can do something when the dialog is dismiss.
     *
     * @param context current Activity
     * @param dialog current dialog
     */
    void onDismiss(@NonNull Activity context, DialogInterface dialog);
    

    每个方法都带有相关的解释,当然,让你把每个方法都实现一次也挺尴尬,所以这里有一个 DefaultShakerCallback ,默认全部方法都是空实现,然后只需要关心自己需要的方法就好。下面挑重点说下。

    自定义UI

    之前这一块并没有扩展出来,就是摇一摇功能太单一,比如我们在开发调试模式时还需要类似切换环境等功能,需要一个按钮时,就可以根据自己指定 UI 实现相关信息显示和对应环境切换。这里提供 initHintViewLayout()onHintViewInflated() 两个方法,第一个是告诉ShakerHelper 你要使用指定的布局展示相关内容。 第二个方法是在View填充好之后返回给你,方便设置相关事件。

    自定义过滤条件

    之前写死过滤掉 Glide 自带的 Fragment,然后如果你自己也有一些「骚操作」也用到 Fragment ,并且不想让它显示在 Dialog 里,那么你可以指定这个过滤条件。ignoreFragments() 就是用来指定相关需要过滤的 Fragment

    另外还有一些 Activity ,可能你并不希望它有摇一摇功能,但是,我们初始化当然是放在 BaseActivity 里,这时候你可以过滤一些 ActivitydisableActivities() 同理就是用来过滤这些 Activity

    摇一摇触发条件

    Shaker 中默认是去判断 X 轴加速度相关的变化,如果你想通过 Y 轴或者 Z 轴或者自己的组合逻辑来触发弹窗展示,这里也给你提供相关方法,方便你实现相关功能。onSenseChanged() 将相关 SensorEvent 事件传递给你,你可以自己觉得是否触发弹窗。

    自定义展示格式和展示逻辑

    如果我写这一套你觉得不太好,比如你不喜欢 > 这符号,没关系,这里你可以自定义 FragmentsHandler 的实现类,自己实现相关功能。FragmentsHandler 其实就两个方法,canHandleFragment()handleFragment() ,当 canHandleFragment() 返回 true 之后,handleFragment()才能被执行。

    说到这里,新功能说的差不多了,目前我已经写好 SupportFragmentFragmentsHandler ,但是对于 Fragment ,这个对应的 FragmentsHandler 还没有实现,因为里面有使用到 FragmentManagergetFragments() 方法,但是在 Fragment 中,这个方法要 O 才开始支持。所以,目前只支持support 包 Fragment,当然,你可以自己完成相关 FragmentsHandler 实现相关拓展。

    GitHub 已经准备就绪 ~Shaker~

    第一篇: Android开发小工具-摇一摇显示当前页面信息

    PS : 昨天 微软已经正式把 GitHub 给收购~~~

    ---- Edit By Joe At 2018 06 05 ----

    相关文章

      网友评论

        本文标题:Android 摇一摇开发工具 Shaker

        本文链接:https://www.haomeiwen.com/subject/loymsftx.html