1.首先,当然是要找到Toast的代码了:
老规矩,framework/base底下
find -name Toast.java
即可。
2.找到Toast界面显示的地方:
真的也是蛮好找的,搜索inflate函数就找到了
public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
Toast result = new Toast(context);
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;
}
就在我们很常用的makeText里边。
3.布局文件就是它喽:
com.android.internal.R.layout.transient_notification
同样的,framework/base/core/res/res,find -name就好。然后就随便你怎么改喽。
不过,需要注意的是,添加自己的图片,作为Toast的背景的时候,比如添加一张.9图的时候,你需要在symbol.xml里头添加上你添加的资源,添加方式依葫芦画瓢就可以。
4.附加题
怎么让toast显示默认居中?
我们发现, mGravity变量直接决定了toast的Gravity方式,直接给它赋值?
错错错!!!
rom订制,最好不要修改默认行为!要不然用户(app码农)该骂了:其他手机调用setGravity能改变toast显示的位置,你家手机为啥不行,垃圾!
还好,android官方早就想到了这个需求:
public Toast(Context context) {
mContext = context;
mTN = new TN();
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);
}
<!-- Default Gravity setting for the system Toast view. Equivalent to: Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM -->
<integer name="config_toastDefaultGravity">0x00000051</integer>
0x00000051是什么鬼?看注释Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM,哦!恍然大悟的感觉。那Gravity.CENTER是多少?看下定义:
public static final int CENTER = CENTER_VERTICAL|CENTER_HORIZONTAL;
//尼玛!
public static final int CENTER_VERTICAL = AXIS_SPECIFIED<<AXIS_Y_SHIFT;
public static final int CENTER_HORIZONTAL = AXIS_SPECIFIED<<AXIS_X_SHIFT;
我比较懒,写个Demo,断点下,得出Gravity.CENTER int值等于17,那就是0x00000011喽,
填到config.xml里头,准备编译出framework-res.apk,丢进去。
打完收工!去嘘嘘一下,编译实在是慢。
30分钟之后,尼玛,怎么无效?
mtk垃圾!
肯定是编译器出问题了!
不行全编一下!
还是老实打日志吧!发现默认gravity确实改成17了,一万头曹尼玛。
在我决定转行之前,我发现app码农调用setGravity的例子:
toast.setGravity(Gravity.CENTER,0,0);
尼玛,我知道了:
mTN.mY = context.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.toast_y_offset);
还有个默认值我没注意到。
<dimen name="toast_y_offset">64dip</dimen>
总结:
1.出问题的时候,99%的都是自己的原因,别老赖机器,赖平台,赖别人。
2.除了胆大,还得心细。