美文网首页
Toast 从源码到自定义

Toast 从源码到自定义

作者: mm_cuckoo | 来源:发表于2016-12-06 13:25 被阅读41次

    在实际开发中Toast使用频率非常高,但是,自定义Toast个人感觉使用不是很高,下面我们来看一Toast是如何实现View 的,我们如果自定义Toast。

    Toast 源码

    我们这里不进行Toast的全部源码分析,只对我们自定义会用到的部分源码进行分析。

    变量

    1. View mNextView

    这个变量是显示的View

    1. int mDuration

    这个变量是显示时间

    方法

    下面我们来看一下,我们常用的方法makeText():

        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;
        }
    

    首先,我们发现,这是一个 static 修饰的方法,在方法中 new 了一个Toast ,在该方法中加载了显示的View 并对 View 内容进行设置,最后,就是 result.mNextView = v; result.mDuration = duration; 这两行,把View 和 显示时间赋给这两个变量。

    下面我们在看两个方法:

        /**
         * Set the view to show.
         * @see #getView
         */
        public void setView(View view) {
            mNextView = view;
        }
    
        public View getView() {
            return mNextView;
        }
    
        /**
         * Set how long to show the view for.
         * @see #LENGTH_SHORT
         * @see #LENGTH_LONG
         */
        public void setDuration(@Duration int duration) {
            mDuration = duration;
            mTN.mDuration = duration;
        }
    
        @Duration
        public int getDuration() {
            return mDuration;
        }
        
    

    这两个方法不用详细解释,一个是设置和获取View,一个是设置和获取显示时间的。

    我们在来看一下设置位置的方法

        /**
         * Set the location at which the notification should appear on the screen.
         * @see android.view.Gravity
         * @see #getGravity
         */
        public void setGravity(int gravity, int xOffset, int yOffset) {
            mTN.mGravity = gravity;
            mTN.mX = xOffset;
            mTN.mY = yOffset;
        }
    

    最会看一下取消方法
    cancel() ,使用这个方法,取消正在显示的toast。

    自定义 toast

    了解了这些,下面不看我想也会了,下面是我写的一个小例子,仅供参考,实际还要根据自己的需求进行自定义,又说回来了,很少有项目需要自定义Toast的。

    Toast toast = new Toast(this);
    //加载View
    View toastView = LayoutInflater.from(this).inflate(R.layout.toast_view,null);
    //获取View控件
    TextView textView = (TextView) toastView.findViewById(R.id.toast_text);
    ImageView imageView = (ImageView) toastView.findViewById(R.id.toast_iamge);
    //设置View控件内容
    textView.setText("hello good");
    imageView.setImageResource(R.mipmap.idscovery_selected);
    //设置Toast View
    toast.setView(toastView);
    //设置显示时间
    toast.setDuration(Toast.LENGTH_SHORT);
    //设置显示位置
    toast.setGravity(Gravity.CENTER,0,0);
    //显示
    toast.show();
    

    相关文章

      网友评论

          本文标题:Toast 从源码到自定义

          本文链接:https://www.haomeiwen.com/subject/dohrmttx.html