转载请注明出处:王亟亟的大牛之路
这两天 在看一些Window的实现,顺便扫到了Toast,这一篇做一些Toast实现原理的分析
日常安利:https://github.com/ddwhan0123/Useful-Open-Source-Android
Toast位于package android.widget
目录下,跟各类系统提供的控件在一起
在没看源码之前以为他是一个Viewpublic class Toast {}
,结果看只是一个普通的class,甚至连继承都没有,带着疑问我们看下是如何实现,弹窗功能的
构造函数
我们平时其实几乎不会new Toast来做一些操作,但是为了介绍TN对象是什么,所以还是来介绍下
public Toast(Context context) {
this(context, null);
}
public Toast(@NonNull Context context, @Nullable Looper looper) {
mContext = context;
//创建了一个TN对象
mTN = new TN(context.getPackageName(), looper);
//初始化位置
mTN.mY = context.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.toast_y_offset);
mTN.mGravity = context.getResources().getInteger(
com.android.internal.R.integer.config_toastDefaultGravity);
}
最常用的方法makeText
这方法最重要的是给Toast的mNextView对象进行了初始化,在后面的TN对象中也一直会使用这个View对象
public static Toast makeText(@NonNull Context context, @Nullable Looper looper,
@NonNull CharSequence text, @Duration int duration) {
Toast result = new Toast(context, looper);
//构建简单的视图
LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);
result.mNextView = v;
result.mDuration = duration;
return result;
}
TN
TN是Toast类的一个静态内部类,是我们具体实现复层弹窗效果的类,他继承于ITransientNotification.Stub
,也就是说他是一个实用AIDL的方式实现IPC的操作