老规矩,先上效果图吧

主要实现了几种常用的方式:

1.最基本的Toast

系统自带Toast采用的是队列的方式, 等当前Toast消失后, 下一个Toast才能显示出来;原因是Toast的管理是在队列中,点击一次,就会产生一个新的Toast,要等这个队列中的Toast处理完,这个显示Toast的任务才算结束。 so~ 我们可以把Toast改成单例模式,没有Toast再新建它,这样也就解决了连续点击Toast,一直在显示的问题。

2.自定义位置的Toast

3.自定义布局(带图片)的Toast

4.自定义带动画效果的Toast控件

OK,下面上代码

代码实现:

先上Activity的代码

public class ToastActivity extends BaseTitleActivity {@BindView(R.id.btn_basic_toast)Button basicToast;@BindView(R.id.btn_basic_toast2)Button basicToast2;@BindView(R.id.btn_custom_location)Button customLocation;@BindView(R.id.btn_custom_picture)Button customPicture;@BindView(R.id.btn_custom_smile)Button customSmile;@BindView(R.id.btn_custom_smile2)Button customSmile2;//    private static CustomToast customToastView;public static void newInstance(Context context){Intent intent = new Intent(context, ToastActivity.class);context.startActivity(intent);}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic int getResourcesId() {return R.layout.activity_toast;}@Overridepublic void initView() {}@Overridepublic void initData() {}@Overridepublic int getTitleText() {return R.string.play_toast;}@OnClick( {R.id.btn_basic_toast, R.id.btn_custom_location, R.id.btn_custom_picture, R.id.btn_custom_smile, R.id.btn_custom_smile2,R.id.btn_basic_toast2} )public void onViewClick(View v){switch (v.getId()){/*  最基本的Toast,解决了原生Toast不能快速更新的问题 */case R.id.btn_basic_toast:ToastUtils.showToast(this, "这是最基本的Toast");break;case R.id.btn_basic_toast2:ToastUtils.showToast(this, "===已更新===");break;/* 自定义位置的Toast* 相对于Gravity.LEFT位置, x方向上的偏移量, y方向上的偏移量 */case R.id.btn_custom_location:Toast toast = Toast.makeText(ToastActivity.this, "自定义位置的Toast", Toast.LENGTH_SHORT);toast.setGravity(Gravity.LEFT,0, 0);toast.show();break;/* 带图片的Toast,自定义布局* 参考 Toast.makeText() 方法 */case R.id.btn_custom_picture:Toast result = new Toast(this);View toastView = LayoutInflater.from(this).inflate(R.layout.toast_custom, null);ImageView img = (ImageView) toastView.findViewById(R.id.iv_img);TextView msg = (TextView) toastView.findViewById(R.id.tv_msg);img.setImageResource(R.mipmap.jyfr_icon_mpossh3x);msg.setText(R.string.picture_toast);result.setView(toastView);result.setGravity(Gravity.BOTTOM, 0 , 0);result.setDuration(Toast.LENGTH_SHORT);result.show();break;/* 自定义Toast控件,带个动画效果* 解决了原生Toast不能快速更新的问题* 但是并没有摆脱原生Toast显示方法的调用 */case R.id.btn_custom_smile:ToastUtils.showToast(this, "在看我", true);break;case R.id.btn_custom_smile2:ToastUtils.showToast(this, "==还在看我==", true);break;default:break;}}
}

对应的布局代码较为简单,就不贴了

下面是第四种效果实现的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:background="@drawable/shape_background_toast"><ImageViewandroid:id="@+id/iv_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:scaleType="center"android:visibility="visible"/><com.example.xuetaotao.helloworld.widget.CustomToastandroid:id="@+id/smileView"android:layout_width="50dp"android:layout_height="50dp"android:layout_margin="10dp"android:layout_gravity="center" /><TextViewandroid:id="@+id/tv_msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text=""android:textSize="18sp"android:textColor="@color/common_blue"/></LinearLayout>

接着是自定义控件部分的代码

public class CustomToast extends View {/*** 初始化一些变量* 实现3个构造函数* 初始化画笔参数和矩形参数* 设置画笔的参数及矩形的参数* 重写onMeasure:onMeasure()方法中主要负责测量,决定控件本身或其子控件所占的宽高* 重写onDraw:onDraw()方法负责绘制,即如果我们希望得到的效果在Android原生控件中没有现成的支持,那么我们就需要自己绘制我们的自定义控件的显示效果。* 自定义View中的动画效果实现*/private Toast toast;private Context context;RectF rectF = new RectF();  //矩形,设置Toast布局时使用ValueAnimator valueAnimator;    //属性动画private Paint paint;    //自定义View的画笔float mAnimatedValue = 0f;private float mWidth = 0f;  //view的宽private float mPadding = 0f;    //view的内边距private float endAngle = 0f;    //圆弧结束的度数private float mEyeWidth = 0f;   //笑脸的眼睛半径private boolean isSmileLeft = false;private boolean isSmileRight = false;public CustomToast(Context context){super(context);this.context = context;}public CustomToast(Context context, AttributeSet attrs){super(context, attrs);this.context = context;}public CustomToast(Context context, AttributeSet attrs, int defStyleAttr){super(context, attrs, defStyleAttr);this.context = context;}private void initPaint(){paint = new Paint();paint.setAntiAlias(true);   //抗锯齿paint.setStyle(Paint.Style.STROKE); //画笔的样式:空心paint.setColor(Color.parseColor("#5cb85c"));    //绘制的颜色paint.setStrokeWidth(dip2px(2));    //设置笔刷的粗细}private void initRect(){rectF = new RectF(mPadding, mPadding, mWidth-mPadding, mWidth-mPadding);}//dip转px。为了支持多分辨率手机public int dip2px(float dpValue){final float scale = getContext().getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);initPaint();initRect();mWidth = getMeasuredWidth();    //view的宽度mPadding = dip2px(10);mEyeWidth = dip2px(3);}//每次触摸了自定义View/ViewGroup时都会触发onDraw()方法@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint.setStyle(Paint.Style.STROKE);canvas.drawArc(rectF, 180, endAngle, false, paint );    //画微笑圆弧paint.setStyle(Paint.Style.FILL);   //画笔的样式:实心if (isSmileLeft){canvas.drawCircle(mPadding+mEyeWidth+mEyeWidth/2, mWidth/3, mEyeWidth, paint);  //绘制圆圈}if (isSmileRight){canvas.drawCircle(mWidth-mPadding-mEyeWidth-mEyeWidth/2, mWidth/3, mEyeWidth, paint);}}//开启动画public void startAnimator(boolean playAnimate){if (playAnimate){stopAnimator();startViewAnim(0f, 1f, 2000);}}//停止动画public void stopAnimator(){if (valueAnimator != null){clearAnimation();isSmileLeft = false;isSmileRight = false;mAnimatedValue = 0f;valueAnimator.end();}}/*** 开始动画* @param start 起始值* @param end   结束值* @param time  动画的时间* @return*/public ValueAnimator startViewAnim(float start, float end, long time){valueAnimator = ValueAnimator.ofFloat(start, end);  //设置 ValueAnimator 的起始值和结束值valueAnimator.setDuration(time);    //设置动画时间valueAnimator.setInterpolator(new LinearInterpolator());    //设置补间器,控制动画的变化速率valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {    //设置监听器。监听动画值的变化,做出相应方式@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mAnimatedValue = (float) valueAnimator.getAnimatedValue();if (mAnimatedValue < 0.5){isSmileLeft = false;isSmileRight = false;endAngle = -360 * (mAnimatedValue);} else if (mAnimatedValue > 0.55 && mAnimatedValue < 0.7){endAngle = -180;isSmileLeft = true;isSmileRight = false;} else{endAngle = -180;isSmileLeft = true;isSmileRight = true;}postInvalidate();      //重绘}});if (!valueAnimator.isRunning()){valueAnimator.start();}return valueAnimator;}/*** 本质上还是依赖Android原生Toast的显示方法来进行显示,* 只是引入了自定义的布局,添加了自定义动画*/public void show(String message, boolean playAnimate){/* 解决多次点击Toast一直提示不消失问题 */if (toast == null){toast = new Toast(context);}View customToastView = LayoutInflater.from(context).inflate(R.layout.toast_custom, null);TextView msg2 = (TextView) customToastView.findViewById(R.id.tv_msg);msg2.setText(message);msg2.setBackgroundResource(R.drawable.shape_text_toast);msg2.setTextColor(Color.parseColor("#ffffff"));ImageView img2 = (ImageView) customToastView.findViewById(R.id.iv_img);img2.setImageResource(R.mipmap.jyfr_icon_mpossh3x);
//        img2.setVisibility(View.GONE);CustomToast customToast = (CustomToast) customToastView.findViewById(R.id.smileView);customToast.startAnimator(playAnimate);toast.setView(customToastView);toast.setGravity(Gravity.BOTTOM, 0 , 0);toast.setDuration(Toast.LENGTH_SHORT);toast.show();}}

最后把效果一和四共用到的工具类贴上来,主要是为了解决连续点击Toast,一直在显示的问题。补充一点:效果四仍然是基于系统原生Toast的显示方法来显示的,所以那个连续点击一直显示的问题还是存在的,后面再试试不用这种方式吧。

public class ToastUtils {private static Toast toast;private static CustomToast customToast;/*** 自定义CustomToast的显示* @param context   上下文* @param message   提示内容* @param playAnimate   是否显示动画  true,显示     false,不显示*/public static void showToast(Context context, String message, boolean playAnimate){if (customToast == null){customToast = new CustomToast(context);}customToast.show(message, playAnimate);}/*** Android原生Toast的显示,主要解决点多少就提示多少次的问题*/public static void showToast(Context context, String content){if (toast == null){toast = Toast.makeText(context, content, Toast.LENGTH_SHORT);} else {toast.setText(content);}toast.show();}}

OK,完成,新手入门学习报到~

最后附上两篇大佬的文章:

自定义View—自定义属性及引用

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

Android Toast使用的简单小结相关推荐

  1. android Toast居中最简单例子

    android Toast最简单例子 Toast toast=Toast.makeText(this, "这里显示文字内容.", Toast.LENGTH_LONG);toast. ...

  2. 你不会以为Android Toast就只是简单的吐司吧?,移动端跨平台开发

    先看看上面用到的asInterface方法: public static top.greendami.aidl.IMyTest asInterface(android.os.IBinder obj) ...

  3. Android技能树 — 树基础知识小结(一)

    前言: 现在安卓面试,对于数据结构的问题也越来越多了,也经常看到别人发的面试题都是问什么红黑树,二叉树查找等,所以我们虽然不会马上就会各种难的面试题,但起码树的基础知识还是要会的,这样才能去进一步学. ...

  4. android toast的使用

    今天,没有什么可以写的,在网上查找资料,发现toast有很多知识点,所以记录一下. Toast Toast是为了给当前视图显示一个浮动的显示块,它永远不会获得焦点.一般用于提示一些不那么引人注目,但是 ...

  5. Android 6.0 超级简单的权限申请2 (Permission)

    代码地址如下: http://www.demodashi.com/demo/13506.html 写在前面 上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission ...

  6. Android 自定义组合控件小结

    Android 自定义组合控件小结 引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控 ...

  7. Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明

    http://blog.csdn.net/wangfayinn/article/details/8065763 Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失. ...

  8. Android Studio开发:简单的登录注册界面

    Android开发:编写简单的登录界面与注册界面 1.登录界面布局 1.1主布局的布局方式是垂直布局,第一个TextView控件在顶部居中布置,显示"用户登录 "字样 <Te ...

  9. android扫码 超简单零代码

    android扫码 超简单零代码 小序 背景介绍 前期准备 zxing和华为扫码服务对比 开始搬运 结语 小序 这是一篇纯新手教学,本人之前没有任何安卓开发经验(尴尬),本文也不涉及任何代码就可以使用 ...

  10. 自定义 Android toast 字体大小

    让Android Toast 居中 可以设置 字体大小 Toast toast = Toast.makeText(this, "这是一个简单的自定义Toast", Toast.LE ...

最新文章

  1. 数据类型转换、==和===的判断
  2. gradlew 的https代理设定
  3. 机器狗常州巡逻防疫,喊话“不扎堆不聚集”,网友:给孩子安个狗头吧
  4. containerd发布了CRI修复程序和CVE-2019-5736更新的runc
  5. java基础(六) switch语句的深入解析
  6. 深入理解Async/Await
  7. Android WebView 图片超出宽度自适应,点击查看大图
  8. java 模块化osgi_OSGi简介–模块化Java
  9. YIi2 對接 支付寶Alipay支付接口
  10. python子进程进行kinit认证_使用kafka-python客户端进行kafka kerberos认证
  11. c语言计算器模拟程序,【C语言】 模拟计算器
  12. RabbitMQ获取队列的消息数目
  13. 案例33-用户退出功能
  14. 回忆一次面试Android研发的问题
  15. mysql 三角函数_三角函数公式
  16. Typora 官网被Q了?(文中附下载地址)
  17. 超好用的在线OCR识别,文档/证件/发票/票据都支持,居然还免费
  18. 计算机博士、加班到凌晨也要化妆、段子手……IT 女神驾到!
  19. 领英如何发布动态与查看自己一共发了多少条动态
  20. 传大疆北美裁员1/3,离职高管透露内部斗争严重

热门文章

  1. matlab画概率密度图
  2. 永洪报表工具_国内报表工具排行?
  3. vs2019配置glfw、glad等环境
  4. Android脱壳圣战---360脱壳与修复
  5. 经典日常英语口语回汇总大全
  6. cocos2d-x初步
  7. qPCR定量方法在肠道微生物特定种属定量应用
  8. javascript通过银行卡号识别所属银行
  9. Excel在统计分析中的应用—第十一章—相关分析-多元相关-偏相关系数
  10. linux wamp,常见的WAMP集成环境