自定义Toast原理
概要
1. 使用Toast遇到的问题
2. Toast源码及原理
3. 我的单例类 T.java
使用Toast遇到的问题
- 原生的Toast真的很难看不是吗
多个Toast依次显示,程序都结束了还在不停的显示呢
解决办法:自定义Toast + 单例类
Toast源码及原理
Toast的源码不多,只有423行
有些我们常用的方法,想必不用多说,例如:
public Toast(Context context)
public void show()
public void cancel()
public static Toast makeText(Context context, int resId, int duration)
public static Toast makeText(Context context, CharSequence text, int duration)
重要的是:
有一个内部类TN
(其实是一个Binder),是TransientNotification
的缩写 短暂的通知
private static class TN extends ITransientNotification.Stub {
final Runnable mShow = new Runnable() {
public void run() {
handleShow();
}
};
final Runnable mHide = new Runnable() {
public void run() {
handleHide();
// Don't do this in handleHide() because it is also invoked by handleShow()
mNextView = null;
}
};
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
final Handler mHandler = new Handler();
int mGravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
int mX, mY;
float mHorizontalMargin;
float mVerticalMargin;
/**
* @me: mNextView是Toast要显示的View
*/
View mView;
View mNextView;
WindowManagerImpl mWM;
/**
* @me: 这里有些值得注意的 params.flags
* 使其不可点击,不可获取焦点,保证屏幕高亮
* 窗口类型为WindowManager.LayoutParams.TYPE_TOAST
*/
TN() {
// XXX This should be changed to use a Dialog, with a Theme.Toast
// defined that sets up the layout params appropriately.
final WindowManager.LayoutParams params = mParams;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.Lay