初学android-Toast的源码分析

  在刚开始学习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: " <
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Toast 是一个轻量级的 UI 组件,用于在屏幕上显示简短的提示信息。Toast 的使用非常简单,只需要调用 Toast.makeText() 方法设置要显示的文本和时长即可。 下面是 Toast源码解释: 首先,Toast 是一个系统级别的服务,它通过 WindowManager 来显示提示信息。在 Toast 的构造函数中,会创建一个 WindowManagerImpl 对象: ``` WindowManagerImpl wm = (WindowManagerImpl) context.getSystemService(Context.WINDOW_SERVICE); ``` 然后,通过 LayoutInflater 来加载 Toast 的布局文件: ``` LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mNextView = inflate.inflate(com.android.internal.R.layout.transient_notification, null); ``` 接着,通过 Toast 的 setView() 方法将布局文件设置给 Toast: ``` setView(mNextView); ``` 在 Toast 的 show() 方法中,通过 WindowManager 将 Toast 显示在屏幕上: ``` wm.addView(mNextView, mParams); ``` Toast 的显示时间由 LENGTH_SHORT 和 LENGTH_LONG 两个常量决定,分别对应短时间和长时间。在 Toast 的构造函数中,会根据传入的时长值设置 Toast 的显示时间: ``` if (duration == LENGTH_SHORT) { mDuration = 2000; } else if (duration == LENGTH_LONG) { mDuration = 3500; } ``` 最后,在 Toast 的 run() 方法中,会根据显示时间来隐藏 Toast: ``` long delay = mDuration - (now - mShowTime); if (delay <= 0) { hide(); } else { mHandler.postDelayed(mHide, delay); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值