Android Toast使用的简单小结

Android Toast使用的简单小结老规矩 先上效果图吧主要实现了几种常用的方式 1 最基本的 Toast 系统自带 Toast 采用的是队列的方式 等当前 Toast 消失后 下一个 Toast 才能显示出来 原因是 Toast 的管理是在队列中 点击一次 就会产生一个新的 Toast 要等这个队列中的 Toast 处理完 这个显示 Toast 的任务才算结束 nbsp so 我们可以把 Toast 改成单例模式 没有 Toast 再新建它 这样也就

老规矩,先上效果图吧

Android Toast使用的简单小结

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

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); } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public int getResourcesId() { return R.layout.activity_toast; } @Override public void initView() { } @Override public void initData() { } @Override public 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; } } } 

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

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

 
   
   
    
    
    
  

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

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); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); initPaint(); initRect(); mWidth = getMeasuredWidth(); //view的宽度 mPadding = dip2px(10); mEyeWidth = dip2px(3); } //每次触摸了自定义View/ViewGroup时都会触发onDraw()方法 @Override protected 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() { //设置监听器。监听动画值的变化,做出相应方式 @Override public 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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204467.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午8:14
下一篇 2026年3月19日 下午8:14


相关推荐

  • Hadoop生态系统-一般详细

    Hadoop生态系统-一般详细首先我们先了解一下Hadoop的起源。然后介绍一些关于Hadoop生态系统中的具体工具的使用方法。如:HDFS、MapReduce、Yarn、Zookeeper、Hive、HBase、Oozie、Mahout、Pig、Flume、Sqoop。Hadoop的起源DougCutting是Hadoop之父,起初他开创了一个开源软件Lucene(用Java语言编写,提供了全文检索引擎的架构,与Goog…

    2022年5月19日
    47
  • MyBatis 批量插入数据的 3 种方法

    MyBatis 批量插入数据的 3 种方法批量插入功能是我们日常工作中比较常见的业务功能之一 今天来一个 MyBatis 批量插入的汇总篇 同时对 3 种实现方法做一个性能测试 以及相应的原理分析 先来简单说一下 3 种批量插入功能分别是 循环单次插入 MP 批量插入功能 原生批量插入功能 准备工作开始之前我们先来创建数据库和测试数据 执行的 SQL 脚本如下 创建数据库 SETNAMESutf

    2025年6月20日
    4
  • 2019最火的程序员必看微小说《竹叶青》转载「建议收藏」

    引子终有一天我手中的编译器将成为我灵魂的一部分,这世界在我的眼中将被代码重构,我将看到山川无尽银河生灵都汇成二进制的数字河流,过往英雄都在我脑海眼前一一浮现,而我听到无数码农跪倒在我的程序面前呼喊。他们叫我代码之神。到那个时候,我想我一定可以找回你。一这是一个属于代码的修真世界。这世界里的每一个人,每一个东西,包括高山大海,刀剑风云,其本质都是一串数字流。打个比方,如果你知道一块石头…

    2022年4月11日
    45
  • 基于Pytorch的强化学习(DQN)之 Multi-agent 基本概念

    基于Pytorch的强化学习(DQN)之 Multi-agent 基本概念

    2026年3月16日
    3
  • pycharm pip源修改以及包管理

    pycharm pip源修改以及包管理pycharm下如何将默认的pip源改成国内能快速访问的源,以及如何进行包管理pycharm 是一款进行python项目开发的利器,不过还是有新手在使用pycharm时,并不知道如何进行包管理,pip包管理pycharm 如何进行包管理呢,其实很简答安装安装包流程如下注意2位置,是选择相应版本的py

    2022年8月28日
    4
  • USB OTG简单介绍

    USB OTG简单介绍

    2021年12月14日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号