Android特效专辑(三)——自定义不一样的Toast

Android特效专辑(三)——自定义不一样的Toast


大家都知道,Android的控件有时候很难满足我们的需求,所以我们需要自定义View。自定义的方式很多,有继承原生控件也有直接自定义View的,今天写的是自定义的Toast,当然,这个不是复写Toast,是换一种表达形式,哈哈,后续会增加自定义View的方方面面

这里啰嗦几句,我看到网上很多教程写的很不详细,就像是直接CV过来的一样,所以有时间我就会把我需要的东西写起来,然后尽可能的描述的清楚一点,以后我工作用到了就可以直接拿来用了,同时也可以把有用的星系分享给大家,这就是我写博客 的初衷了,经常去墙外面找的好例子,我也是摸透了才放在我博客上,如果以后有疑问或者不懂的,可以加我QQ沟通

先来看看效果图吧

是不是挺好看的,如果你看过Toast的源码就会知道,他主要是用了WindowManager,我们也直接来写一个

TabToast

package com.lgl.toast;

import android.content.Context;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class TabToast {

    /**
     * Toast字体大小
     */
    private static final float DEFAULT_TEXT_SIZE = 14;
    /**
     * Toast字体颜色
     */
    private static final int DEFAULT_TEXT_COLOR = 0xffffffff;
    /**
     * Toast背景颜色
     */
    private static final int DEFAULT_BG_COLOR = 0xE6f5695a;
    /**
     * Toast的高度(单位dp)
     */
    private static final float DEFAULT_TOAST_HEIGHT = 50.0f;

    private static Context mContext;
    private volatile static TabToast mInstance;
    private static Toast mToast;
    private View layout;
    private TextView tv;

    public TabToast(Context context) {
        mContext = context;
    }

    /**
     * 单例模式
     *
     * @param context
     *            传入的上下文
     * @return TabToast实例
     */
    private static TabToast getInstance(Context context) {
        if (mInstance == null) {
            synchronized (TabToast.class) {
                if (mInstance == null) {
                    mInstance = new TabToast(context.getApplicationContext());
                }
            }
        }
        return mInstance;
    }

    private static void getToast(int duration) {
        //设置位置int gravity, int xOffset, int yOffset
        if (mToast == null) {
            mToast = new Toast(mContext);
            mToast.setGravity(Gravity.BOTTOM, 0, 0);
            //设置显示时间
            mToast.setDuration(duration == Toast.LENGTH_LONG ? Toast.LENGTH_LONG
                    : Toast.LENGTH_SHORT);
        }
    }

    public static void makeText(Context context, String text) {
        makeText(context, text, Toast.LENGTH_SHORT);
    }

    public static void makeText(Context context, String text, int duration) {
        getInstance(context);
        getToast(duration);
        if (mInstance.layout == null || mInstance.tv == null) {
            LinearLayout container = new LinearLayout(mContext);
            LinearLayout.LayoutParams rootParams = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);
            container.setLayoutParams(rootParams);
            container.setBackgroundColor(DEFAULT_BG_COLOR);
            container.setGravity(Gravity.CENTER);

            mInstance.tv = new TextView(mContext);
            LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(
                    getScreenWidth(mContext), dp2px(DEFAULT_TOAST_HEIGHT));
            mInstance.tv.setLayoutParams(tvParams);
            mInstance.tv.setPadding(dp2px(5), dp2px(2), dp2px(5), dp2px(2));
            mInstance.tv.setGravity(Gravity.CENTER);
            mInstance.tv.setTextColor(DEFAULT_TEXT_COLOR);
            mInstance.tv.setMaxLines(2);
            mInstance.tv.setEllipsize(TextUtils.TruncateAt.END);
            mInstance.tv.setBackgroundColor(DEFAULT_BG_COLOR);
            mInstance.tv.setTextSize(DEFAULT_TEXT_SIZE);

            container.addView(mInstance.tv);

            mInstance.layout = container;

            mToast.setView(mInstance.layout);
        }
        mInstance.tv.setText(text);
        mToast.show();
    }

    /**
     * dp转px
     *
     * @param value
     *            dp
     * @return px
     */
    public static int dp2px(float value) {
        float scale = mContext.getResources().getDisplayMetrics().density;
        return (int) (value * scale + 0.5f);
    }

    /**
     * 获得屏幕宽度
     *
     * @param context
     *            Context
     * @return px
     */
    public static int getScreenWidth(Context context) {
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        float density = outMetrics.density;
        return (int) (outMetrics.widthPixels * density);
    }

}

然后直接调用就可以了

TabToast.makeText(MainActivity.this, "自定义Toast");

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9391760

时间: 2024-09-11 07:11:24

Android特效专辑(三)——自定义不一样的Toast的相关文章

Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸

Android特效专辑(五)--自定义圆形头像和仿MIUI卸载动画-粒子爆炸 好的,各位亲爱的朋友,今天讲的特效还是比较炫的,首先,我们会讲一个自定义圆形的imageView,接着,我们会来实现粒子爆炸的特效,按照国际惯例,无图无真相的没这个效果也是模仿大神的,现在应用在了我的<Only>上 截图 好的,我们新建一个工程--AnimView,我们要用到的图片 一.自定义圆形头像-- 直接开写了,要实现的东西都在注释上了 1.编写自定义属性attr.xml <?xml version=&q

Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View

Android特效专辑(十二)--仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术不行,也太懒了 PS:这个view也是我模仿了人家的效果,参考了人家的思路写的,不是纯手撸,罪过罪过,网上应该也能找到很多这样的效果,我只是加入了一些自己的需求在里面 我么新建一个工程--Whew RoundImageView 这个之前讲过,网上 的粒子,把头像变成圆形的,这里就不多说了,直接撸代码

Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用动画会有不一样的感受

Android特效专辑(七)--飞机升空特效,一键清理缓存,灵活运用属性动画 最近的几篇博文反响还不错,也会继续的写下去的,关于这些特效的专辑,大多数也是借鉴大神的,最近由于工作的关系,会深入的了解一下Android BLE与硬件设备的串口通讯相关的内容,也会时不时的分享出来,当然,大家是一起学习,我毕竟也是初学者,今天讲的是小火箭的动画效果,用到了基础动画做了一些偷梁换柱的事情,明天还是后天,再更新一个心型起泡飞舞的特效,就不会这么持续的更新特效专辑这一系列了,毕竟<Only>这个软件也正在

Android特效专辑(十一)——仿水波纹流量球进度条控制器,实现高端大气的主流特效

Android特效专辑(十一)--仿水波纹流球进度条控制器,实现高端大气的主流特效 今天看到一个效果挺不错的,就模仿了下来,加上了一些自己想要的效果,感觉还不错的样子,所以就分享出来了,话不多说,上图 截图 CircleView 这里主要是实现中心圆以及水波特效 package com.lgl.circleview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Co

Android特效专辑(九)——仿微信雷达搜索好友特效,逻辑清晰实现简单

Android特效专辑(九)--仿微信雷达搜索好友特效,逻辑清晰实现简单 不知不觉这个春节也已经过完了,遗憾家里没网,没能及时给大家送上祝福,今天回到深圳,明天就要上班了,小伙伴们是不是和我一样呢?今天讲的是一个大家都见过的动画,雷达搜索好友嘛,原理也十分的简单,你看完我的分析,也会觉得很简单了,国际惯例,无图无真相,我们先看看效果图,对了,真 测试机送人了,所讲这段时间应该一直用模拟器显示吧! 截图 这个界面相信大家都认识,我们来说下原理,其实就三层 中间是一张图片,然后画四个圆,这个应该简单

Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命

Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/liuguilin.html 日后我所写的特效专辑也会以一添加在这个专栏上,今天写的这个特效,是关于聊天的,你肯定遇到过,就是你跟人家聊天的时候,比如发送应(么么哒),然后屏幕上全部就是表情了,今天我们就是做这个,撒花的特效,国际惯例,上图 截图 实现这样的效果,你要知道贝塞尔曲线,何谓贝塞尔曲线?其实

Android特效专辑(八)——实现心型起泡飞舞的特效,让你的APP瞬间暖心

Android特效专辑(八)--实现心型起泡飞舞的特效,让你的APP瞬间暖心 马上也要放年假了,家里估计会没网,更完这篇的话,可能要到年后了,不过在此期间会把更新内容都保存在本地,这样有网就可以发表了,也是极好的,今天说的这个特效,原本是Only上的一个小彩蛋的,我们来看看图片 只要我点击了Only这个字,下面就开始上升起起泡了,这个实现起来其实就是一个欲盖弥彰的动画而已,准备好三张颜色不一样的心型图片咯,这样的话,我们就开始动手来写一写吧! 首先新建一个工程--HeartFaom 准备工作就是

Android特效专辑(四)——APP主页框架TabHost绑定ViewPager的替换者TabLayout

Android特效专辑(四)--APP主页框架TabHost绑定ViewPager的替换者TabLayout 现在很多app都在追求简单明了,功能又要强大,不过我还是喜欢之前的app风格,就是TabHost,在现在也是有许多app在用,不过选项卡可能都放在下面了,我们想要tabhost有viewpager的滑动效果,其实也很简单,那就是fragment,在这之前,我都是很复杂的把它们全部绑定在一起联动的,但是现在就要简单很多了 ,我们用Android Studio开发 先看下效果图吧 我们这次使

Android特效专辑(一)——水波纹过渡特效(首页)

Android特效专辑(一)--水波纹过渡特效(首页) 也是今天看到的一个特效,感觉挺漂亮的,最近也一直在筹划一个APP,就想把他当做APP的首页,然后加些处理,关于首页APP的特效等我完工了再贴出来吧,现在先把这个特效给分享出来,只是稍微改动了一点点而已. 原地址:http://blog.csdn.net/jdsjlzx/article/details/44601239 先看效果图: 我们先创建一个UIUtils,转换一些单位 package com.lgl.test; import andr