写在前面
对于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 =