安卓项目实战之:基于Toasty库封装的精美的Toast工具类

效果演示

安卓项目实战之:基于Toasty库封装的精美的Toast工具类_第1张图片

添加依赖

1,在Project的build.gradle文件中添加:

allprojects {
	repositories {
		...
		maven { url "https://jitpack.io" }
	}
}

2,在app的build.gradle文件中添加:

dependencies {
	...
	compile ''com.github.GrenderG:Toasty:1.1.5''
}

3,自定义旧版本工具类如下:

public class ToastUtils {

    /***
     *
     * 弹出成功消息*   
     * @param text 需要显示的消息   
     * @param isShowIcon 是否需要显示图标 默认显示
     *
     */
    public static void toastSuccess(@NonNull String text, @NonNull Boolean isShowIcon) {
        Toasty.success(MyApplication.getInstance(), text, Toast.LENGTH_SHORT, isShowIcon).show();
    }

    /***弹出错误消息*   
     * *@param text 需要显示的消息   
     * *@param isShowIcon 是否需要显示图标 默认显示*
     * */

    public static void toastError(@NonNull String text, @NonNull Boolean isShowIcon) {
        Toasty.error(MyApplication.getInstance(), text, Toast.LENGTH_SHORT, isShowIcon).show();
    }

     /***弹出info消息*   
      * @param text 需要显示的消息*
      * @param isShowIcon 是否需要显示图标 默认显示*
     */

    public static void toastInfo(@NonNull String text, @NonNull Boolean isShowIcon) {
        Toasty.info(MyApplication.getInstance(), text, Toast.LENGTH_SHORT, isShowIcon).show();
    }

    /***弹出警告消息*   
     *@param text 需要显示的消息   
     *@param isShowIcon 是否需要显示图标 默认显示*
     */

    public static void toastWarn(@NonNull String text, @NonNull Boolean isShowIcon) {
        Toasty.warning(MyApplication.getInstance(), text, Toast.LENGTH_SHORT, isShowIcon).show();
    }

    /***
     * 弹出一般的消息
     * @param text
     */
    public static void toastNormal(@NonNull String text) {
        Toasty.normal(MyApplication.getInstance(), text).show();
    }

    /***
     * 弹出一般的带icon的消息
     * @param text
     * @param icon  图片id
     */
    public static void toastNormalWithIcon(@NonNull String text, @NonNull int icon) {
        Toasty.normal(MyApplication.getInstance(), text, ContextCompat.getDrawable(MyApplication.getInstance(), icon) ).show();
    }


    /***
     *
     * @param text 文本
     * @param icon 图标id
     * @param isShowIcon 是否显示图标
     * @param textColor 文本的颜色
     * @param color 设置Toast的颜色
     * @param isShowBackColor 是否应用设置的颜色,如果为false代表不应用,那么依旧显示的是Normal时的颜色
     */
    public static void toastCustorm(@NonNull String text,@NonNull int icon, @NonNull Boolean isShowIcon, @NonNull int textColor,@NonNull int color,@NonNull Boolean isShowBackColor) {
        Toasty.custom(MyApplication.getInstance(), text, ContextCompat.getDrawable(MyApplication.getInstance(), icon),textColor, color, Toast.LENGTH_SHORT, isShowIcon,
                isShowBackColor).show();
    }
}

目前GitHub上最新版本为1.3.0,因为最新版本更改了Toast里面的默认字体大小,显得有点太大,不太好看,虽然也可以很方便的额外修改字体大小,字体样式但是毕竟要多写代码比较麻烦,个人感觉旧版本的字体大小刚好合适,如果想使用最新版本,那么接着往下看,因为新版本和旧版本的api有一点差别。

如果对旧版本字体大小和字体样式没有特定需要,那么使用旧版本即可。

修改版本号为最新的1.3.0:

'com.github.GrenderG:Toasty:1.3.0'

3,定义新版本工具类如下:

public class ToastUtils {

    /***
     *
     * 弹出成功消息*   
     * @param text 需要显示的消息   
     * @param isShowIcon 是否需要显示图标 默认显示
     *
     */
    public static void toastSuccess(@NonNull String text, @NonNull Boolean isShowIcon) {
        Toasty.success(MyApplication.getInstance(), text, Toast.LENGTH_SHORT, isShowIcon).show();
    }

    /***弹出错误消息*   
     * *@param text 需要显示的消息   
     * *@param isShowIcon 是否需要显示图标 默认显示*
     * */

    public static void toastError(@NonNull String text, @NonNull Boolean isShowIcon) {
        Toasty.error(MyApplication.getInstance(), text, Toast.LENGTH_SHORT, isShowIcon).show();
    }

     /***弹出info消息*   
      * @param text 需要显示的消息*
      * @param isShowIcon 是否需要显示图标 默认显示*
     */

    public static void toastInfo(@NonNull String text, @NonNull Boolean isShowIcon) {
        Toasty.info(MyApplication.getInstance(), text, Toast.LENGTH_SHORT, isShowIcon).show();
    }

    /***弹出警告消息*   
     *@param text 需要显示的消息   
     *@param isShowIcon 是否需要显示图标 默认显示*
     */

    public static void toastWarn(@NonNull String text, @NonNull Boolean isShowIcon) {
        Toasty.warning(MyApplication.getInstance(), text, Toast.LENGTH_SHORT, isShowIcon).show();
    }

    /***
     * 弹出一般的消息
     * @param text
     */
    public static void toastNormal(@NonNull String text) {
        Toasty.normal(MyApplication.getInstance(), text).show();
    }

    /***
     * 弹出一般的带icon的消息
     * @param text
     * @param icon  图片id
     */
    public static void toastNormalWithIcon(@NonNull String text, @NonNull int icon) {
        Toasty.normal(MyApplication.getInstance(), text, ContextCompat.getDrawable(MyApplication.getInstance(), icon) ).show();
    }


    /***
     *
     * @param text 文本
     * @param icon 图标id
     * @param isShowIcon 是否显示图标
     * @param color 设置Toast的颜色
     * @param isShowBackColor 是否应用设置的颜色,如果为false代表不应用,那么依旧显示的是Normal时的颜色
     */
    public static void toastCustorm(@NonNull String text,@NonNull int icon, @NonNull Boolean isShowIcon, @NonNull int color,@NonNull Boolean isShowBackColor) {
        Toasty.custom(MyApplication.getInstance(), text, ContextCompat.getDrawable(MyApplication.getInstance(), icon), color, Toast.LENGTH_SHORT, isShowIcon,
                isShowBackColor).show();
    }
}

4,对应的MyApplication代码如下:

public class MyApplication extends Application {

    private static MyApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance= this;

//        Toasty.Config.getInstance()
//                .setTextColor(Color.GREEN)  // 文字颜色
//                .setToastTypeface(Typeface.SANS_SERIF) // 设置内置字体
//                .setToastTypeface(Typeface.createFromAsset(getAssets(), "PCap Terminal.otf"))  // 设置其他字体
//                .setTextSize(14) // 单位sp
//                .apply(); // required

    }

    public static MyApplication getInstance(){
        return instance;
    }
}

如果想要修改全局的弹出的Toast的文字颜色,字体样式,字体大小等可以在MyApplication中添加上面注释掉的代码,此时会全局生效,如果只想更改某次弹出的Toast的样式的话,可以这样设置:

Toasty.Config.getInstance()
             .setTextColor(Color.GREEN)
             .setToastTypeface(Typeface.createFromAsset(getAssets(), "PCap Terminal.otf"))
             .apply();
ToastUtils.toastCustorm("点击了添加按钮3333!",R.drawable.ic_arrow_back_white,false, Color.RED,true);
Toasty.Config.reset(); // 该句代表重置配置,即恢复默认,如果不写该句,上面的配置会全局生效,直到某次调用reset终止。

注意旧版本中不支持以上更改字体大小和字体样式的代码,但旧版本中支持修改文本颜色,且修改的操作是封装在Custorm方法之中的,详见旧版本工具类中的最后一个方法定义。

另外再推荐一个支持更多属性的第三方Toast库:https://github.com/Muddz/StyleableToast ,如果这个满足不了你的需求,可以尝试使用该库。

优化的Toast工具类,去除重复弹出,直接改变文本

public class ToastUtil {
    private static boolean isShow = true;//默认显示
    private static Toast mToast = null;//全局唯一的Toast

    /*private控制不应该被实例化*/
    private ToastUtil() {
        throw new UnsupportedOperationException("不能被实例化");
    }

    /**
     * 全局控制是否显示Toast
     *
     * @param isShowToast
     */
    public static void controlShow(boolean isShowToast) {
        isShow = isShowToast;
    }

    /**
     * 取消Toast显示
     */
    public void cancelToast() {
        if (isShow && mToast != null) {
            mToast.cancel();
        }
    }

    /**
     * 短时间显示Toast
     *
     * @param context
     * @param message
     */
    public static void showShort(Context context, CharSequence message) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
            } else {
                mToast.setText(message);
            }
            mToast.show();
        }
    }

    /**
     * 短时间显示Toast
     *
     * @param context
     * @param resId   资源ID:getResources().getString(R.string.xxxxxx);
     */
    public static void showShort(Context context, int resId) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, resId, Toast.LENGTH_SHORT);
            } else {
                mToast.setText(resId);
            }
            mToast.show();
        }
    }

    /**
     * 长时间显示Toast
     *
     * @param context
     * @param message
     */
    public static void showLong(Context context, CharSequence message) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, message, Toast.LENGTH_LONG);
            } else {
                mToast.setText(message);
            }
            mToast.show();
        }
    }

    /**
     * 长时间显示Toast
     *
     * @param context
     * @param resId   资源ID:getResources().getString(R.string.xxxxxx);
     */
    public static void showLong(Context context, int resId) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, resId, Toast.LENGTH_LONG);
            } else {
                mToast.setText(resId);
            }
            mToast.show();
        }
    }

    /**
     * 自定义显示Toast时间
     *
     * @param context
     * @param message
     * @param duration 单位:毫秒
     */
    public static void show(Context context, CharSequence message, int duration) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, message, duration);
            } else {
                mToast.setText(message);
            }
            mToast.show();
        }
    }

    /**
     * 自定义显示Toast时间
     *
     * @param context
     * @param resId    资源ID:getResources().getString(R.string.xxxxxx);
     * @param duration 单位:毫秒
     */
    public static void show(Context context, int resId, int duration) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, resId, duration);
            } else {
                mToast.setText(resId);
            }
            mToast.show();
        }
    }

    /**
     * 自定义Toast的View
     *
     * @param context
     * @param message
     * @param duration 单位:毫秒
     * @param view     显示自己的View
     */
    public static void customToastView(Context context, CharSequence message, int duration, View view) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, message, duration);
            } else {
                mToast.setText(message);
            }
            if (view != null) {
                mToast.setView(view);
            }
            mToast.show();
        }
    }

    /**
     * 自定义Toast的位置
     *
     * @param context
     * @param message
     * @param duration 单位:毫秒
     * @param gravity
     * @param xOffset
     * @param yOffset
     */
    public static void customToastGravity(Context context, CharSequence message, int duration, int gravity, int xOffset, int yOffset) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, message, duration);
            } else {
                mToast.setText(message);
            }
            mToast.setGravity(gravity, xOffset, yOffset);
            mToast.show();
        }
    }

    /**
     * 自定义带图片和文字的Toast,最终的效果就是上面是图片,下面是文字
     *
     * @param context
     * @param message
     * @param iconResId 图片的资源id,如:R.drawable.icon
     * @param duration
     * @param gravity
     * @param xOffset
     * @param yOffset
     */
    public static void showToastWithImageAndText(Context context, CharSequence message, int iconResId, int duration, int gravity, int xOffset, int yOffset) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, message, duration);
            } else {
                mToast.setText(message);
            }
            mToast.setGravity(gravity, xOffset, yOffset);
            LinearLayout toastView = (LinearLayout) mToast.getView();
            ImageView imageView = new ImageView(context);
            imageView.setImageResource(iconResId);
            toastView.addView(imageView, 0);
            mToast.show();
        }
    }

    /**
     * 自定义Toast,针对类型CharSequence
     *
     * @param context
     * @param message
     * @param duration
     * @param view
     * @param isGravity        true,表示后面的三个布局参数生效,false,表示不生效
     * @param gravity
     * @param xOffset
     * @param yOffset
     * @param isMargin         true,表示后面的两个参数生效,false,表示不生效
     * @param horizontalMargin
     * @param verticalMargin
     */
    public static void customToastAll(Context context, CharSequence message, int duration, View view, boolean isGravity, int gravity, int xOffset, int yOffset, boolean isMargin, float horizontalMargin, float verticalMargin) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, message, duration);
            } else {
                mToast.setText(message);
            }
            if (view != null) {
                mToast.setView(view);
            }
            if (isMargin) {
                mToast.setMargin(horizontalMargin, verticalMargin);
            }
            if (isGravity) {
                mToast.setGravity(gravity, xOffset, yOffset);
            }
            mToast.show();
        }
    }

    /**
     * 自定义Toast,针对类型resId
     *
     * @param context
     * @param resId
     * @param duration
     * @param view             :应该是一个布局,布局中包含了自己设置好的内容
     * @param isGravity        true,表示后面的三个布局参数生效,false,表示不生效
     * @param gravity
     * @param xOffset
     * @param yOffset
     * @param isMargin         true,表示后面的两个参数生效,false,表示不生效
     * @param horizontalMargin
     * @param verticalMargin
     */
    public static void customToastAll(Context context, int resId, int duration, View view, boolean isGravity, int gravity, int xOffset, int yOffset, boolean isMargin, float horizontalMargin, float verticalMargin) {
        if (isShow) {
            if (mToast == null) {
                mToast = Toast.makeText(context, resId, duration);
            } else {
                mToast.setText(resId);
            }
            if (view != null) {
                mToast.setView(view);
            }
            if (isMargin) {
                mToast.setMargin(horizontalMargin, verticalMargin);
            }
            if (isGravity) {
                mToast.setGravity(gravity, xOffset, yOffset);
            }
            mToast.show();
        }
    }
}

你可能感兴趣的:(Android,安卓项目实战系列)