Toast_P_PLUS


/**
 * Created by yss on 2018/4/23.
 * 自定义背景色 字体大小 颜色 内间距 显示时长
 * 同一内容的Toast不重复弹窗
 */

public class NoRepeatToast {

    private static NoRepeatToast instance;

    private NoRepeatToast() {
    }

    public static NoRepeatToast getInstance() {
        if (instance == null) {
            synchronized (NoRepeatToast.class) {
                if (instance == null) {
                    instance = new NoRepeatToast();
                }
            }
        }
        return instance;
    }

    // Toast.LENGTH_SHORT 2s LONG 3.5S
    private final int LENGTH_LONG_TIME = 3500;
    private final int LENGTH_SHORT_TIME = 2000;
    private final int MIN_TIME = 1000;
    //text size
    private final int TEXT_SIZE_DEFAULT = 14;
    //shape_padding
    private final int PADDING_DEFAULT = 12;
    private Toast currentToast;
    private String currentContent;
    private int textSize = TEXT_SIZE_DEFAULT;
    private int shapePadding = PADDING_DEFAULT;
    private int showTime = LENGTH_SHORT_TIME;


    private void show(Context context, String content) {
        if (TextUtils.isEmpty(content))
            return;
        if (currentToast != null) {
            if (TextUtils.equals(content, currentContent)) {
                currentToast.show();
                keepSameShowAndResetSchedule(showTime);
                return;
            }
            currentToast.cancel();
            stopAllTask();
        }
        if (Looper.myLooper() != Looper.getMainLooper()) {
            Looper.prepare();
            currentToast = createCustomToast(context, content);
            currentToast.show();
            currentContent = content;
            Looper.loop();
            return;
        }
        currentToast = createCustomToast(context, content);
        currentToast.show();
        currentContent = content;

        startShedule(context);
        stopSchedule(showTime);
    }

    /**
     * Activity 销毁 不再显示
     */
    public void cancle() {
        if (currentToast != null) {
            currentToast.cancel();
            currentToast = null;
        }
        if (mHandler != null) {
            mHandler.removeCallbacksAndMessages(null);
            mHandler = null;
        }
    }

    private Toast createCustomToast(Context context, String content) {
        Toast customToast = Toast.makeText(context, content, Toast.LENGTH_SHORT);
        if (showTime == LENGTH_LONG_TIME) {
            customToast = Toast.makeText(context, content, Toast.LENGTH_LONG);
        }
        //view 可以通过 LayoutInflater.from(context).inflat(R.layout.yourview);
        TextView view = new TextView(context);
        view.setBackgroundResource(R.drawable.shape_toast_bg);
        view.setText(content);
        view.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);
        float afterConvert = Utils.getTypeVauleByUnit(context, TypedValue.COMPLEX_UNIT_DIP, shapePadding);
        int padding = new Float(afterConvert).intValue();
        view.setPadding(padding, padding, padding, padding);
        view.setTextColor(Color.WHITE);
        customToast.setView(view);
        customToast.setGravity(Gravity.CENTER, 0, -100);
        return customToast;
    }

    private void initDefaultConfig() {
        this.showTime = LENGTH_LONG_TIME;
        this.textSize = TEXT_SIZE_DEFAULT;
        this.shapePadding = PADDING_DEFAULT;
    }

    public void showLongTime(Context context, String content) {
        initDefaultConfig();
        show(context, content);
    }

    public void showShortTime(Context context, String content) {
        initDefaultConfig();
        show(context, content);
    }

    public void showSpecialType(Context context, String content, int time, int textSize, int shapePadding) {
        this.textSize = textSize;
        this.shapePadding = shapePadding;
        this.showTime = time;
        show(context, content);
    }


    private WeakRefHandler mHandler;
    private Runnable showTask;
    private Runnable cancelTask;

    private Runnable initShowTask() {
        Runnable task = new Runnable() {
            @Override
            public void run() {
                if (currentToast != null) {
                    currentToast.show();
                    mHandler.postDelayed(showTask, 1000);
                }
            }
        };
        return task;
    }

    private Runnable initCancelTask() {
        Runnable task = new Runnable() {
            @Override
            public void run() {
                if (currentToast != null) {
                    currentToast.cancel();
                }
                mHandler.removeCallbacksAndMessages(null);
            }
        };
        return task;
    }

    private void startShedule(Context context) {
        if (showTime < MIN_TIME)
            return;
        if (mHandler == null) {
            initHandler(context);
        }
        showTask = initShowTask();
        mHandler.post(showTask);
    }

    private void stopSchedule(int time) {
        if (showTime < MIN_TIME)
            return;
        cancelTask = initCancelTask();
        mHandler.postDelayed(cancelTask, time);
    }

    private void keepSameShowAndResetSchedule(int time) {
        if (showTime < MIN_TIME)
            return;
        mHandler.removeCallbacksAndMessages(null);
        showTask = initShowTask();
        cancelTask = initCancelTask();
        mHandler.post(showTask);
        mHandler.postDelayed(cancelTask, time);
    }

    private void stopAllTask() {
        if (showTime < MIN_TIME)
            return;
        mHandler.removeCallbacksAndMessages(null);
    }

    private void initHandler(Context context) {
        if (mHandler == null) {
            mHandler = new WeakRefHandler(context) {
                @Override
                public void handleMessage(Message msg) {

                }
            };
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值