设计给的图:


这这弱提示和 QQ 的非常像:


看到这个我第一想法是 SnakeBar
,但是会发现一个问题,SnackBar
需要当前的 Context
,而且当前界面消失的时候,显示的 Snackbar
也会消失。最重要的是工程中的所有 Toast
都要替换成这种弱提示,而之前的方法只需要接受一个 String
参数就能够完成了,所以为了减少工作量,我们在实现该功能的时候,最好也只是需要传入相同参数。
最终决定也是用 Toast
来完成这个效果:
首先设置 Toast
的宽度高度和动画效果:
1 | //全屏和动画的设置方法 |
上面的 height
只是在 Demo 中使用的高度,或者使用 -2 会自适应布局。
在 styles 中需要添加:
1 | <style name="PopupAnimation" parent="android:Animation" mce_bogus="1"> |
其中 anim 文件下的两个动画文件分别为:
enter:
1 | <?xml version="1.0" encoding="utf-8"?> |
exit:
1 | <?xml version="1.0" encoding="utf-8"?> |
动画的执行时间和移动的距离可以自己适当的调整。
接下来,就是让 Toast
的位置在顶部出现,这个顶部必须是状态栏下面,而不是标题栏下面,还有很重要的一点是,如果想要达到 QQ 所显示的那种效果,这个应用必须是所有状态栏都是透明的,否则将几乎不能实现这种效果。
给主题加上状态栏透明的效果:
1 | <style name="changeBar" parent="Theme.AppCompat.Light.NoActionBar"> |
Toast
的显示:
1 | public Toast toast; |
其中两个 Toast
的布局都是根据需求自定义的,分别是:
toast:
1 | <?xml version="1.0" encoding="utf-8"?> |
toaste:
1 | <?xml version="1.0" encoding="utf-8"?> |
仔细观察会发现,是有 Toast
下面是有一定阴影的,所以需要给 Toast
的背景加上:
1 | <?xml version="1.0" encoding="utf-8"?> |
最后根据不同的状态,显示不同的 Toast
:
1 | findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { |
大致的效果图,懒的找图标了,就用一样的了:


最后,这只是个简单的 Demo ,实际中那样改变主题是非常不好的,因为那个只适用于 API 19 及以上的版本,如果真要改变状态栏的颜色,可以参考 StatusBarCompat、SystemBarTint 或者 status-bar-compat,使用它们都可以轻松的动态改变状态栏的颜色,但是他们都有局限性,都需要一个参数,就是当前的 Activity
。
另外,其实 QQ 的那个 Toast
的顶部其实还有渐变的阴影,所以看上效果很更好看一点,新版的 QQ 标题栏的颜色也改成了渐变蓝色,也是很好看的。