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;
  }
 }
}

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

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

<?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">

 <ImageView
  android: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.CustomToast
  android:id="@+id/smileView"
  android:layout_width="50dp"
  android:layout_height="50dp"
  android:layout_margin="10dp"
  android:layout_gravity="center" />

 <TextView
  android: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);
 }

 @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,完成,新手入门学习报到~

到此这篇关于Android Toast使用的简单小结的文章就介绍到这了,更多相关Android Toast使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android中使用Toast.cancel()方法优化toast内容显示的解决方法

    产品在测试过程中发现一个bug,就是测试人员不停的疯狂的点击某个按钮,触发了toast以后,toast内容会一直排着队的显示出来,不能很快的消失.这样可能会影响用户的使用. 看到Toast有一个cancel()方法: 复制代码 代码如下: void cancel() Close the view if it's showing, or don't show it if it isn't showing yet. 做程序员的,基本一看api就知道,用这个可以取消上一个toast的显示,然后显示下一

  • Android Service中使用Toast无法正常显示问题的解决方法

    本文实例讲述了Android Service中使用Toast无法正常显示问题的解决方法.分享给大家供大家参考,具体如下: 在做Service简单练习时,在Service中的OnCreate.OnStart.OnDestroy三个方法中都像在Activity中同样的方法调用了Toast.makeText,并在Acitivy中通过两个按钮来调用该服务的onStart和onDestroy方法: DemoService代码如下: @Override public void onCreate() { su

  • android之自定义Toast使用方法

    Android系统默认的Toast十分简洁,使用也非常的简单.但是有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合. 使用自定义Toast,首先我们需要添加一个布局文件,该布局文件的结构和Activity使用的布局文件结构一致,在该布局文件中我们需设计我们Toast的布局,例如: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> &

  • Android使用Toast显示消息提示框

    在前面的实例中,已经应用过Toast类来显示一个简单的提示框了.这次将对Toast进行详细介绍.Toast类用于在屏幕中显示一个消息提示框,该消息提示框没有任何控制按钮,并且不会获得焦点,经过一段时间后自动消失.通常用于显示一些快速提示信息,应用范围非常广泛. 使用Toast来显示消息提示框非常简单,只需要一下三个步骤: (1).创建一个Toast对象.通常有两种方法:一种是使用构造方式进行创建: Toast toast=new Toast(this); 另一种是调用Toast类的makeTex

  • Android控件系列之Toast使用介绍

    Toast英文含义是吐司,在Android中,它就像烘烤机里做好的吐司弹出来,并持续一小段时间后慢慢消失 Toast也是一个容器,可以包含各种View,并承载着它们显示. 使用场景: 1.需要提示用户,但又不需要用户点击"确定"或者"取消"按钮. 2.不影响现有Activity运行的简单提示. 用法: 1.可以通过构造函数初始化: 复制代码 代码如下: //初始化Toast Toast toast = new Toast(this); //设置显示时间,可以选择To

  • Android开发实现自定义Toast、LayoutInflater使用其他布局示例

    本文实例讲述了Android开发实现自定义Toast.LayoutInflater使用其他布局.分享给大家供大家参考,具体如下: 内容: 1.自定义样式toast 2.再活动中添加其他布局 实现效果: 步骤: 一.自定义View 引用zidingyixml文件 生成一个布局对象 二.采用Toast 的addView() 方法将该对象添加到Toast对象中 三.显示:Toast.show() 具体实现方法: public class MainActivity extends Activity {

  • 分享Android中Toast的自定义使用

    1.Toast源码分析 老规矩,我们先去看Toast的源码. Toast有两种显示布局方式,一种最常见调用Toast.makeText()  ,看源码是这样写的 public static Toast makeText(Context context, CharSequence text, @Duration int duration) { Toast result = new Toast(context); LayoutInflater inflate = (LayoutInflater) c

  • Android Toast使用的简单小结(推荐)

    老规矩,先上效果图吧 主要实现了几种常用的方式: 1.最基本的Toast 系统自带Toast采用的是队列的方式, 等当前Toast消失后, 下一个Toast才能显示出来:原因是Toast的管理是在队列中,点击一次,就会产生一个新的Toast,要等这个队列中的Toast处理完,这个显示Toast的任务才算结束.so~ 我们可以把Toast改成单例模式,没有Toast再新建它,这样也就解决了连续点击Toast,一直在显示的问题. 2.自定义位置的Toast 3.自定义布局(带图片)的Toast 4.

  • 关于Android高德地图的简单开发实例代码(DEMO)

    废话不多说了,直接给大家上干货了. 以下为初次接触时 ,练手的DEMO import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatab

  • Android ActionBar完全解析使用官方推荐的最佳导航栏(上)

    本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/actionbar.html Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作.界面导航等功能.使用ActionBar的好处是,它可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何

  • Android开发实现的简单计算器功能【附完整demo源码下载】

    本文实例讲述了Android开发实现的简单计算器功能.分享给大家供大家参考,具体如下: 这个Android计算器虽然还有点小bug,不过简单的计算功能还是没问题的哦: 先上图看效果 比较简单,所以我就没怎么写注释,应该一看就能明白的 有不明白的可以发信问我 先贴MainActivity.java代码 package com.example.calculator; import android.app.Activity; import android.os.Bundle; import andro

  • Android 10 适配攻略小结

    相比较去年写的Android 9适配,这次Android 10的内容有点多.没想到写了我整整两天,吐血中... 准备工作 老规矩,首先将我们项目中的 targetSdkVersion 改为 29. 1.Scoped Storage(分区存储) 说明 在Android 10之前的版本上,我们在做文件的操作时都会申请存储空间的读写权限.但是这些权限完全被滥用,造成的问题就是手机的存储空间中充斥着大量不明作用的文件,并且应用卸载后它也没有删除掉.为了解决这个问题,Android 10 中引入了 Sco

  • JS判断是否在微信浏览器打开的简单实例(推荐)

    最近做很多HTML5的项目,很多页面会通过微信微博等SNS分享出去.在分享页面上提供公司APP的下载.但是在很多应用的浏览器中,点击下载链接无法下载应用.那么针对这些浏览器我们需要给用户提示从safari或者系统自带的浏览器打开分享页面.通过js就可以判断当前页面是在什么浏览器打开的. 以下是一段示例代码,注释中表明了通过JS如何判断是否在微信浏览器打开,是否在QQ空间浏览器,是否在新浪微博打开.当然可以做得更完善一点,再加上判断是在移动设备打开还是在PC端浏览器打开的,更加细分一点,可以判断是

  • PHP的openssl加密扩展使用小结(推荐)

    引言 互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求).数据完整性(没有被人修改过).数据私密性(密文,无法直接读取)等.虽然现在已经有SSL/TLS协议实现的HTTPS协议,但是因在客户端上依赖浏览器的正确实现,而且效率又很低,所以一般的敏感数据(如交易支付信息等)还是需要我们使用加密方法来手动加密. 虽然对于一般的WEB开发人员来说,大可不必深入了解一些安全相关的底层技术,但学习加密基础知识,使用现有加密相关工具却十分必要.

  • Android中Progress的简单实例

    Android中Progress的简单实例 Android中Progress网上的demo都是瞎扯淡,当然,你们也可以认为我的demo是瞎扯淡,因为,毕竟要理解别人的思路,很头疼,主要还是知道思路,然后一步一步慢慢来.今天我讲的是Progress的实现,如果看了我之前的博客,应该多少有些了解.话不多说,来看实例: xml东西不多,自己定义把,因为Progress包括了一级读取和二级读取,所以主要是根据按钮来实现,下面就是一个点击事件: public void onClick(View v) {

  • Android ActionBar完全解析使用官方推荐的最佳导航栏(下)

    本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/actionbar.html 限于篇幅的原因,在上篇文章中我们只学习了ActionBar基础部分的知识,那么本篇文章我们将接着上一章的内容继续学习,探究一下ActionBar更加高级的知识.如果你还没有看过前面一篇文章的话,建议先去阅读Android ActionBar完全解析,使用官方推荐的最佳导航栏(

  • json与jsonp知识小结(推荐)

    json 1. json 的值可以是下面这些类型: ① 数字(整数或浮点数),比如123,1.23 ② 字符串(在双引号中) ③ 逻辑值(true 或 false) ④ 数组(在方括号中) ⑤ 对象(在花括号中) ⑥ null 2. json解析方法 ① eval('(' + jsondata + ')' ); 使用时永远是不安全的,代码注入 ② JSON.parse(jsondata); JSONLint json:字符串校验工具 3. jQuery 实现ajax jQuery.ajax([s

随机推荐