自定义Toast及动画的二三事

来源:互联网 发布:iptv管理系统源码下载 编辑:程序博客网 时间:2024/05/19 20:46

       实际案例中,系统的Toast经常无法满足我们的需求,那么作为开发人员,就难免要去自定义一个我们自己的Toast...

        关于Toatst的系统的源码这里不想赘述,因为网上有很多(至少我也是上网查的),但是也仅限于介绍了源码和简陋的Demo....本篇直奔主题,介绍我在项目中真实用到的Toast...

       先附上一段别人关于Toast源码的介绍(恩,我也是看的他的,才一步一步改的),链接点击打开链接


       那么上面的文章浏览一遍后,大致有个概念了,所谓吐司,就是获得窗口管理器WindowManager,进而去设置LayoutParams的参数,将你想要展示的View挂在WindowManager上,下面上代码(之所以我补上代码,而是图片。是我个人认为在AS上看代码,字体颜色不同,更容易去读懂代码)



          初始化Toast的参数,自不必说,该画圈的画圈,该注释的注释



        可以看到show方法里是通过handler去post一个Runnable去来控制Toast的(用handler原因,在于发生异常时可以直接移除他的任务)

        有show方法,Toast显示完以后自然还有hide方法


        hide方法很简单,当需要隐藏时,将wm,view等全部设置为null,并且将handler里的任务全部移除(有可能任务还没执行完就需要hide的情况,否则会发生再次弹出吐司的时候,显示和隐藏的动画时间混乱,无法正常播放的情况)已便下一次显示。

        可能会有人问,为什么要设置null啊,多次显示不就多次初始化了吗,但是经我踩过的坑的可得知,Context和这个WindowManager是关联在一起的,我来举一个例子,但你Toast的动画还没结束,当前的Activity就被销毁了,然后当真正动画结束的时候,去触发hide方法的时候,会抛异常,因为你当前的Acitivty和WindowManager毫无关联,于是程序崩溃,那么如何在Activity异常关闭的时候阻止他不抛出异常,我是这么做的


        在活动onPause的时候,根据吐司的isShow布尔值去判断当前是否有吐司正在显示,如果正在显示,但是界面又不被显示了,执行hide方法,将参数清空

       下面来展示一下Toast的效果..(暂时是截图,到时候上传gif格式的)


           ------------------------更新于9/7

hide方法必须移除view,否则会出其他的bug(我这发生了toast显示以后,dialog无法显示的问题,移除后正常)

0 0
原创粉丝点击