美文网首页高级UI
Github项目之Toast封装

Github项目之Toast封装

作者: NoBugException | 来源:发表于2020-01-04 01:07 被阅读0次

    我在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。

    【文本颜色】

    图片.png

    设置文本颜色有两个方法,分别是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]之间的文字设置成不同的颜色。如图:

    图片.png

    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视图的大小,效果如下:

    图片.png

    【设置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

    【修改字体】

    图片.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效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_2效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_3效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_4效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_5效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_6效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_7效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_8效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_9效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_10效果如下:

    图片.png

    AllToast.TYPEFACE.TYPEFACE_11效果如下:

    图片.png

    【支持矢量图动画】

                        .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;
    

    [本章完...]

    相关文章

      网友评论

        本文标题:Github项目之Toast封装

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