Android 自定义Toast

自定义Toast

android系统默认toast非常呆板,在这个追求“颜值”的世界里,它已经严重拖累了应用界面的美观,那么如何才能美化toast,使之与应用的界面相协调呢。不多说了,现在开始介绍。

先来上图看看系统默认toast和本例要实现的自定义toast的效果对比

系统自带的toast

系统自带toast

本文要实现的toast效果

本文要实现的toast效果

要想实现自定义的toast 就得先了解系统的toast是怎么实现的。使用系统默认的toast,想必大家都会:

Toast.makeText(MainActivity.this,"normaltoast",Toast.LENGTH_SHORT).show();

那么我们就先从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;
}

上面是Toast类的makeText()方法的源码,我们可以看到,在这个方法中,系统先实例化了一个Toast对象,然后加载了一个布局,拿到布局里的TextView,然后把要Toast的内容设置到这个TextView上面。最后给Toast对象的两个成员变量赋值:一个是Toast内容所在的TextView,另一个是Toast的时间。然后返回Toast对象。

所以要想改变toast的样式,就可以通过修改inflate填充的布局来实现。可以自定义一个布局,通过修改布局文件的样式来实现toast样式的不同。

另外,我们卡伊看到Toast源码中有如下方法:

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

Toast对象可以通过这个方法来设置show的具体位置。

最后,我们可已经上面的设置思路在一个utils中实现:

public class ToastUtils {
    private static Toast mToast;

    /**
     * @param activity 上下文
     * @param content 吐司内容
     */
    public static void show(Activity activity,  String content) {
        show(activity, content, Gravity.BOTTOM, 0, getWidthPixels(activity) / 6);
    }

    private static int getWidthPixels(Activity activity) {
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        return dm.widthPixels;
    }

    /**
     * @param activity 上下文
     * @param content 吐司内容
     * @param gravity 重心
     * @param xOffset X偏移量
     * @param yOffset Y偏移量
     */
    @SuppressLint("InflateParams")
    public static void show(Activity activity,  String content, int gravity,
                            int xOffset, int yOffset) {
       int  widthPixels = getWidthPixels(activity);
        if (mToast == null) {
            mToast = new Toast(activity);
            mToast.setGravity(gravity, xOffset, yOffset);

            View toastView = LayoutInflater.from(activity).inflate(
                    R.layout.toastview, null);
            mToast.setView(toastView);
            TextView tv = (TextView) toastView
                    .findViewById(R.id.textView_toastView_content);
            ImageView iv_iconb = (ImageView) toastView
                    .findViewById(R.id.imageView_toastView_toast_iconb);
            ImageView iv_icon = (ImageView) toastView
                    .findViewById(R.id.imageView_toastView_toast_icon);
            tv.setPadding((int) (0.056 * widthPixels),
                    (int) (0.0282 * widthPixels),
                    (int) (0.056 * widthPixels),
                    (int) (0.0282 * widthPixels));
            LayoutParams params_iv_b = (LayoutParams) iv_iconb
                    .getLayoutParams();
            LayoutParams params_iv = (LayoutParams) iv_icon.getLayoutParams();
            int margins_bottom = params_iv.height
                    + (int) (0.0282 * widthPixels * 3.5)
                    - params_iv_b.height;
            params_iv_b.setMargins(0, 0, 0, margins_bottom);
            iv_iconb.setVisibility(View.VISIBLE);
            iv_icon.setVisibility(View.VISIBLE);
            tv.setText(content);
        } else {
            ((TextView) (mToast.getView()
                    .findViewById(R.id.textView_toastView_content)))
                    .setText(content);
        }
        mToast.show();
    }
}

你看通过简单的阅读源码,就可以成功设置出自己想要的toast效果了。是不是很简单呢?

项目源码:https://github.com/TitleZWC/CustomToast

转载请说明出处:http://blog.csdn.net/TitleZWC/article/details/50752739
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值