Toast的高级自定义方式-循序渐进带你了解toast

写在前面

对于Toast的使用,相信只要是使用过android的童鞋都不会陌生,它是不需要和用户进行交互的一个提示框。接下来,让我们一步步自定义Toast,全方位的玩转Toast,实现它的不同显示需求。从此再也不怕提示的各种变态需求。~
先来看看效果图,苦逼的华为手机,4.4版本,没root,只能连上电脑,再通过录制电脑屏幕上的手机画面录屏,求推荐好方法录屏。~
这里写图片描述

1.最基本的Toast

Toast.makeText(getApplicationContext(),"最基本的Toast",Toast.LENGTH_SHORT).show();

这个不用多讲。

2.自定义位置的Toast

通过Toast类自带的定义位置的方法来设置toast出现的位置。

                Toast toast=Toast.makeText(getApplicationContext(),"自定义位置的Toast",Toast.LENGTH_SHORT);
 /**
 *Toast.setGravity(gravity,xOffset,yOffset);
 *@gravity:toast的位置
 *@xOffset:相对于gravity x方向上的偏移量。yOffset:相对于gravity y方向的偏移量。
 */
                toast.setGravity(Gravity.LEFT,50,0);
                toast.show();

3.带图片的toast

讲了前面的两种最基本的Toast,我们现在先来看看toast.markText的源码,看看toast到底是如何显示的。
源码位置:frameworks/base/core/java/Android/widght/Toast.java (Toast#makeText())
其中要增加的view的布局方式在:frameworks/base/core/res/res/layout/transient_notification.xml。(里面只有一个TextView没啥讲的。)

public static Toast makeText(Context context, CharSequence text, 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;
    }

从上面源码可以得到的东西:1.new一个Toast类,获得当前的context;2.LayoutInflater,动态载入layout的类,将view的布局载入。3.获得view中的textview中的文字信息。4.设置toast的view和duration属性。5.返回toast.从而实现了toast的markText方法。
ok!,搞懂了toast.markText这部分的源码,我们就可以设置自定义view的toast.
1.创建一个custom_toast.xml,一个LinearLayout,水平方向,ImageView+TextView。设置它们的各种属性。(代码很简单,就不贴了。)
2.自定义Toast.直接上代码

 Toast customToast = new Toast(MainActivity.this.getApplicationContext());
 //获得view的布局
                View customView = LayoutInflater.from(MainActivity.this).inflate(R.layout.custom_toast,null);
                ImageView img = (ImageView) customView.findViewById(R.id.iv);
                TextView tv = (TextView) customView.findViewById(R.id.tv);
                //设置ImageView的图片
                img.setBackgroundResource(R.drawable.ab);
                //设置textView中的文字
                tv.setText("我是带图片的自定义位置的toast");
                //设置toast的View,Duration,Gravity最后显示
                customToast.setView(customView);
                customToast.setDuration(Toast.LENGTH_SHORT);
                customToast.setGravity(Gravity.CENTER,0,0);
                customToast.show();

4.自定义View带动画超高级的Toast.

其实,这个就是3.带图片的toast的加强版。将里面其中的图片,改换成我们自定义的view,通过自定义view,来实现多种多样的Toast.
1.创建自定义的view.CustomToastView继承View.
整体的Custom的结构(下文会有具体实现代码):

public class CustomToastView extends View {
   
   //a.初始化其中的一些变量。
   ......
   //a.实现CustomToastView的3个构造函数
   ......
   //b.初始化画笔的参数和矩形参数
   .....



}

a.初始化其中的一些变量,实现3个构造函数。

public class CustomToastView extends View {
   
     //矩形,设置toast布局时用
    RectF rectF =new RectF();
    //属性动画
    ValueAnimator valueAnimator;
    float mAnimatedValue = 0f;
    //自定义view的画笔
    private Paint mPaint;

    private float mWidth = 0f; //view的宽
    private float mEyeWidth = 0f; //笑脸的眼睛半径
    private float mPadding = 0f;  //view的偏移量。
    private float endAngle = 0f; //圆弧结束的度数

    //是左眼还是右眼
    private boolean isSmileLeft = false;
    private boolean isSmileRight = 
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值