我在Github上更新了一个有关
AllToast
项目,专门针对Toast
进行封装。下面将描述我这个项目该怎么使用,具体代码可以在Github上下载。
【Toast通常用法】
有人说Toast不是很简单吗?这又有什么好封装的,Toast的简单实现如下:
Toast.makeText(this, "提示", Toast.LENGTH_SHORT).show();
效果大致是这样的:
图片.png这种用法比较单一,不能修改背景颜色,不能更改文字大小等等;
它的视图可以通过new Toast().setView()
来自定义,我在Github上对其做了自定义封装。
【Github地址】
https://github.com/NoBugException/AllToast
【绑定Context】
AllToast.with(getApplicationContext());
Toast必须绑定Context,建议绑定Application的Context,不要绑定Activity的Context,防止内存泄漏。
【AllToast简单使用】
AllToast.with(getApplicationContext())
.text("提示012")
.show();
效果如下:
图片.png【位置方向】
AllToast.with(getApplicationContext())
.text("提示0121111")
.gravity(Gravity.CENTER, 0, 0)
.show();
gravity
方法可以设置Toast的方位,后面两个参数分别是X轴和Y轴偏移量。
【文本大小】
AllToast.with(getApplicationContext())
.text("提示0121111")
.gravity(Gravity.CENTER, 0, 0)
.textSize(50)//文本大小,单位是sp
.show();
图片.png
将文本设置为50,单位默认为dp。
【文本颜色】
设置文本颜色有两个方法,分别是textColor(int color)
、textColor(ColorSpan... colorSpans)
,先来看一下前者,代码如下:
AllToast.with(getApplicationContext())
.text("提示0121111")
.gravity(Gravity.CENTER, 0, 0)
.textSize(50)//文本大小,单位是sp
.textColor(Color.parseColor("#FF5E10E9"))
.show();
效果如下:
图片.png显然,前者是修改所有文本的颜色。
再来看一下后者,后者的代码如下:
AllToast.with(getApplicationContext())
.text("提示0121111")
.gravity(Gravity.CENTER, 0, 0)
.textSize(50)//文本大小,单位是sp
.textColor(Color.parseColor("#FF5E10E9"))
.textColor(new AllToast.ColorSpan(Color.parseColor("#CF7256"), 0, 1), new AllToast.ColorSpan(Color.parseColor("#CFF216"), 2, 4))
.show();
后者可以传递多个ColorSpan
对象,代码中将[0,1]和[2,4]之间的文字设置成不同的颜色。如图:
textColor(int color)
和textColor(ColorSpan... colorSpans)
两个设置颜色的方法可以同时使用,前者设置所有文本的颜色,后者设置指定位置文字颜色。
【文本背景颜色】
文本还可以设置背景色,使用textBgColor(ColorSpan... colorSpans)
可以设置指定位置文字的背景色。代码如下:
AllToast.with(getApplicationContext())
.text("提示0121111")
.gravity(Gravity.CENTER, 0, 0)
.textSize(50)//文本大小,单位是sp
.textColor(Color.parseColor("#FF5E10E9"))
.textColor(new AllToast.ColorSpan(Color.parseColor("#CF7256"), 0, 1), new AllToast.ColorSpan(Color.parseColor("#CFF216"), 2, 4))
.textBgColor(new AllToast.ColorSpan(Color.parseColor("#6FD5CA"), 2, 3), new AllToast.ColorSpan(Color.parseColor("#6FF5C1"), 5, 6))
.show();
效果如下:
图片.png【设置圆角矩形的圆角半径】
.radius(50)//单位为dp
效果如下:
图片.png【设置Toast背景】
backgroundColor(@ColorInt int color)
方法可以直接设置Toast的背景颜色,比如设置为蓝色。
.backgroundColor(Color.BLUE)
效果如下:
图片.png除了直接设置为颜色的方法,还有直接设置Drawable的方法,比如:
.background(R.drawable.toast_frame)
或者
.background(getResources().getDrawable(R.drawable.toast_frame))
toast_frame代码如下:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#E67DABE4" />
<stroke
android:color="#BD28D6"
android:width="5dp"/>
<corners
android:radius="24dp" />
</shape>
设置完之后的效果如下:
图片.png【设置Toast宽度和高度】
Toast如果不设置宽度和高度,默认是“包裹内容”的,假如将宽度和高度都设置为200dp
AllToast.with(getApplicationContext())
.text("提示0121111")
.gravity(Gravity.CENTER, 0, 0)
.textSize(50)//文本大小,单位是sp
.textColor(Color.parseColor("#FF5E10E9"))
.textColor(new AllToast.ColorSpan(Color.parseColor("#CF7256"), 0, 1), new AllToast.ColorSpan(Color.parseColor("#CFF216"), 2, 4))
.textBgColor(new AllToast.ColorSpan(Color.parseColor("#6FD5CA"), 2, 3), new AllToast.ColorSpan(Color.parseColor("#6FF5C1"), 5, 6))
//.radius(50)//单位为dp
//.backgroundColor(Color.BLUE)
//.background(getResources().getDrawable(R.drawable.toast_frame))
.background(R.drawable.toast_frame)
.size(200, 200)//单位为dp
.show();
size
方法可以设置Toast视图的大小,效果如下:
【设置Toast显示时长】
显示时长默认为Toast.LENGTH_LONG
,可以将其设置为Toast.LENGTH_SHORT
,使用方法如下:
.duration(Toast.LENGTH_LONG)//时长
Toast.LENGTH_LONG
的时长由Android SDK解决,为7000ms。
Toast.LENGTH_SHORT
的时长由Android SDK解决,为4000ms。
目前只能设置这两种时间,上层一般不能实现自定义Toast显示时长(除非使用反射机制来实现,应该有一些插件化的库已经实现Toast显示时长)。
【添加图标】
默认情况下,可以在文本左边添加一张图片,以下四个方法可以添加一张图片
图片.png 图片.png【修改布局方向】
布局方向默认是横向的,现在修改为纵向
.orientation(AllToast.ORIENTATION.VERTICAL)
效果如下:
图片.png【修改字体】
修改字体的方式有两种,第一种直接传入一个字体,第二种方式传入一个枚举参数,现在将一一演示。
直接传递一个字体,如果传递系统已经声明的字体,如下:
.typeface(Typeface.SANS_SERIF)
.typeface(Typeface.DEFAULT)
.typeface(Typeface.DEFAULT_BOLD)
.typeface(Typeface.MONOSPACE)
.typeface(Typeface.SERIF)
选择其一即可。
或者直接读取本地字体,比如:
.typeface(Typeface.createFromAsset(getAssets(), "typeface_2.ttf"))
当然,我在项目中添加了一些字体,通过传入枚举参数的方式可以引用。
.typeface(AllToast.TYPEFACE.TYPEFACE_6)
AllToast.TYPEFACE.TYPEFACE_1
效果如下:
AllToast.TYPEFACE.TYPEFACE_2
效果如下:
AllToast.TYPEFACE.TYPEFACE_3
效果如下:
AllToast.TYPEFACE.TYPEFACE_4
效果如下:
AllToast.TYPEFACE.TYPEFACE_5
效果如下:
AllToast.TYPEFACE.TYPEFACE_6
效果如下:
AllToast.TYPEFACE.TYPEFACE_7
效果如下:
AllToast.TYPEFACE.TYPEFACE_8
效果如下:
AllToast.TYPEFACE.TYPEFACE_9
效果如下:
AllToast.TYPEFACE.TYPEFACE_10
效果如下:
AllToast.TYPEFACE.TYPEFACE_11
效果如下:
【支持矢量图动画】
.iconDrawable(R.drawable.search_animated_vector, 100, 100)
直接通过iconDrawable
方法设置即可。
效果如下:
347.gif【弹出第二个Toast时,第一个将被直接取消】
有时候,连续点击10次Toast显示按钮,只有等到前面一个Toast消失下一个Toast才会显示,为了解决Toast自身的问题,我在项目中做了处理。
//主线程消息循环的handler
private static final Handler mHandler = new Handler(Looper.getMainLooper());
/**
* 通用
*/
public void show(){
mHandler.post(new Runnable() {
@Override
public void run() {
cancel();
makeText(mContext, toastText !=null ? toastText.get() : "", toastIconDrawable != null ? toastIconDrawable.get() : null, toastDuration).show();
reset();
}
});
}
//取消
private static void cancel() {
if (toastIconDrawable instanceof Animatable && ((Animatable)toastIconDrawable.get()).isRunning()){
//停止动画
((Animatable)toastIconDrawable.get()).stop();
}
if (result != null) {
result.cancel();
result = null;
}
}
每次显示时,立即cancel
掉上一个Toast。
【解决内存泄漏问题】
为了解决内存泄漏问题,项目中,将上一个Toast关闭的同时,还将它设置为null
result = null;
除此之外,采用软引用机制处理临时变量,如:
//文本
private static WeakReference<CharSequence> toastText = null;
//Toast的字体
private static WeakReference<Typeface> toastTypeface = new WeakReference<>(Typeface.DEFAULT);//单位为sp
//设置图标
private static WeakReference<Drawable> toastIconDrawable = null;
//背景
private static WeakReference<Drawable> toastBgDrawable = null;
[本章完...]
网友评论