在刚开始学习android的时候,我对android的疑惑简直快令我放弃,我感觉自己像是漂浮在空中,因为我在敲代码的时候,总感觉我在抄袭代码,并没有自己的思想;而且我抄袭的时候还没有理解这些代码的深层次的东西,比如为什么我能通过new一个ListView,给他传入一个适配器就能在显示屏上显示出一格一格的东西,我甚至很想知道他底层到底是怎么实现的,每一步我都想搞清楚,查阅资料发现并没有写这个的文章,这令我更加疑惑,感觉自己飘在空中。
庆幸我没有放弃,我还是硬着头皮学下去,虽然会用一些控件,组件的简单搭配,但是这些没有“说服”我心中的疑惑,就在昨天,我终于有点小小的明白,只能说小小的,在看到视频里说的自定义toast的时候,看着他进行一步一步的源码分析,我心中似有感悟,于是我也拿着源码分析起来,果然感觉自己开朗了许多,虽然还是有许多疑问。
1.首先打开Toast源码,先查看构造函数
public Toast(Context context) {
//这里初始化了上下文 mContext = context; mTN = new TN();
//这里通过得到toast_y_offset.xml和config_toastDefaultGravity这个资源文件赋值给不知道什么
东东 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); }
2.在这里我不知道TN是什么,于是我找到TN的源码,发现他是一个内部类,这个类几乎就是实现toast的重
要类,真的好长的代码啊,但是也要硬着头皮看,抓住其中的主干,一步一步来
private static class TN extends ITransientNotification.Stub {final Runnable mShow = new Runnable() { @Override public void run() { handleShow(); } }; final Runnable mHide = new Runnable() { @Override 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; int mX, mY; float mHorizontalMargin; float mVerticalMargin; View mView; View mNextView; WindowManager mWM; 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.LayoutParams.WRAP_CONTENT; params.format = PixelFormat.TRANSLUCENT; params.windowAnimations = com.android.internal.R.style.Animation_Toast; params.type = WindowManager.LayoutParams.TYPE_TOAST; params.setTitle("Toast"); params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; } /** * schedule handleShow into the right thread */ @Override public void show() { if (localLOGV) Log.v(TAG, "SHOW: " <