Android Toast 源码分析

转载请注明出处:王亟亟的大牛之路

这两天 在看一些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的操作


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值