自定义Toast

自定义Toast

效果图
自定义Toast自定义Toast

package kong.qingwei.sharedPreferences;

import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;

public class KqwToast implements OnClickListener {

    // 上下文
    private Context mContext;

    private WindowManager mWindowManager;

    private View mKqwToast;

    private WindowManager.LayoutParams mParams;

    /**
     * 构造方法
     *
     * @param context
     */
    public KqwToast(Context context, int bottomHeight) {
        mContext = context;
        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

        mParams = new WindowManager.LayoutParams();
        // 设置显示位置
        mParams.width = LayoutParams.MATCH_PARENT;
        mParams.height = LayoutParams.WRAP_CONTENT;
        mParams.y = 0 == bottomHeight ? 120 : bottomHeight;
        mParams.gravity = Gravity.BOTTOM;
        mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        mParams.type = WindowManager.LayoutParams.TYPE_TOAST;
    }


    /**
     * 显示交易信息
     */
    public void showKqwToast() {
        mKqwToast = View.inflate(mContext, R.layout.kqw_toast, null);
        mWindowManager.addView(mKqwToast, mParams);
    }

    @Override
    public void onClick(View v) {
    }

    /**
     * 关闭提示信息
     */
    public void closeKqwToast() {
        try {
            if (null != mWindowManager && mKqwToast != null) {
                mWindowManager.removeView(mKqwToast);
//                mWindowManager = null;
//                mKqwToast = null;
            }
        } catch (Exception e) {
        }
    }
}

说明

这里只是显示了一个最基础的自定义Toast,具体Toast显示什么内容,什么动画,自己去实现就可以了,隐藏可以使用CountDownTimer倒计时一段时间关闭,根据自己的需求自己定吧。

讲解

主要的思路很简单,最关键的步骤就两部:

  1. 拿到WindowManager,窗口的管理者
  2. 通过WindowManager对象调用addView方法,显示。

API:

addView(mKqwToast, mParams);
  • 第一个参数是我们的自定义Toast的布局
  • 第二个参数是我们设置Toast的参数
mKqwToast = View.inflate(mContext, R.layout.kqw_toast, null);
  • 加载布局,布局文件自己想怎么写就怎么写,代码就不贴了。
mParams.width = LayoutParams.MATCH_PARENT;
mParams.height = LayoutParams.WRAP_CONTENT; 
  • 设置布局的宽和高,这里宽是充满父窗体,高是包裹子布局。可以设置具体的置。
mParams.y
  • 距离Y轴的距离,还有一个mParams.x是距离X轴的距离。
mParams.gravity = Gravity.BOTTOM;
  • 让Toast居于手机屏幕底部
  • 设置成Gravity.BOTTOM后,前面设置的mParams.y就是基于底部的距离,同理,如果设置成Gravity.TOP,就是基于顶部的距离,其它的就不一一举例了。
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
  • 设置不可获取焦点
  • 如果Toast是可以获得焦点的,当Toast显示以后,Toast就会抢夺焦点,这时候点击Toast意外的任何地方,事件都不会传递下去(没有反映),这个根据自己的需求来看把,还有一些其他属性,如屏幕常亮,是否可以点击等等,自己点出来看吧,不举例了。
mParams.type = WindowManager.LayoutParams.TYPE_TOAST;
  • 设置我们自定义的Toast也是一个Toast类型,我看还有还有其它好多类型,具体都是什么效果我也没试过,感兴趣可以自己试试。
mWindowManager.removeView(mKqwToast);
  • 隐藏(移除)Toast

附加

CountDownTimer的初始化:

CountDownTimer countDownTimer = new CountDownTimer(3000, 1000) {
    @Override
    public void onTick(long millisUntilFinished) {
    }
    @Override
    public void onFinish() {
    }
};

CountDownTimer的使用:

countDownTimer.start();

说明:
上面倒计时效果为3秒,每一秒执行回调一次onTick方法,3秒倒计时结束回调onFinish方法

上一篇:C、C++、Java异或运算交换变量变量值的区别


下一篇:Reactor三种线程模型与Netty线程模型