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使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-03-30

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使用介绍

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

分享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显示消息提示框

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

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之自定义Toast使用方法

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

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

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

Android开发中自定义ProgressBar控件的方法示例

本文实例讲述了Android开发中自定义ProgressBar控件的方法.分享给大家供大家参考,具体如下: 很简单,首先加载Drawable,在onMeasure设置好其区域大小, 然后使用canvas.clipRect绘图 public class ProgressView extends ImageView { private Drawable maskDraw; /** * 加载的进度 0-100 */ private int mProcess = 20; public ProgressV

Android开发实现自定义新闻加载页面功能实例

本文实例讲述了Android开发实现自定义新闻加载页面功能.分享给大家供大家参考,具体如下: 一.概述: 1.效果演示: 2.说明:在新闻页面刚加载的时候,一般会出现五种状态 未知状态(STATE_UNKNOW).空状态(STATE_EMPTY).加载中(STATE_LOADING).错误(STATE_ERROT).成功(STATE_SUCCESS) 因为每个Detail页面都会出现,所以我们可以把他们封装成一个LoadPage的自定义view,可以复用 二.实现: 1.首先的定义三个布局,为什

Android编程实现自定义toast示例

本文实例讲述了Android编程实现自定义toast.分享给大家供大家参考,具体如下: 效果图: 代码: //自定义布局的toast customViewToast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast toast = Toast.makeText(ToastTest.this, "top", Toast.LENGTH_SHORT); /

Android开发使用自定义view实现ListView下拉的视差特效功能

本文实例讲述了Android开发使用自定义view实现ListView下拉的视差特效功能.分享给大家供大家参考,具体如下: 一.概述: 现在流型的APP如微信朋友圈,QQ空间,微博个人展示都有视差特效的影子. 如图:下拉图片会产生图片拉升的效果,放手后图片有弹回到原处: 那我们如何实现呢? 1)重写ListView控件: 2)重写里面的overScrollBy方法 3)在松手后执行值动画 二.具体实现: 1.创建ParallaListView 自定义ListView public class P

Android开发使用自定义View将圆角矩形绘制在Canvas上的方法

本文实例讲述了Android开发使用自定义View将圆角矩形绘制在Canvas上的方法.分享给大家供大家参考,具体如下: 前几天,公司一个项目中,头像图片需要添加圆角,这样UI效果会更好看,于是写了一个小的demo进行圆角的定义,该处主要是使用BitmapShader进行了渲染(如果要将一张图片裁剪成椭圆或圆形显示在屏幕上,也可以使用BitmapShader来完成). BitmapShader类完成渲染图片的基本步骤如下: 1.创建BitmapShader类的对象 /** * Call this

Android开发之自定义CheckBox

要实现的效果如下 考虑到关键是动画效果,所以直接继承View.不过CheckBox的超类CompoundButton实现了Checkable接口,这一点值得借鉴. 下面记录一下遇到的问题,并从源码的角度解决. 问题一: 支持 wrap_content 由于是直接继承自View,wrap_content需要进行特殊处理. View measure流程的MeasureSpec: /** * A MeasureSpec encapsulates the layout requirements pass

Android开发实现自定义水平滚动的容器示例

本文实例讲述了Android开发实现自定义水平滚动的容器.分享给大家供大家参考,具体如下: public class HorizontalScrollView extends ViewGroup { //手势 private GestureDetector mGestureDetector; private HorizontalScroller mScroller; private int curID; //快速滑动 private boolean isFlying; //--回调函数-----

Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】

本文实例讲述了Android开发之自定义view实现通讯录列表A~Z字母提示效果.分享给大家供大家参考,具体如下: 开发工具:eclipse 运行环境:htc G9 android2.3.3 话不多说,先看效果图 其实左右边的A~Z是一个自定义的View,它直接覆盖在ListView上. MyLetterListView: public class MyLetterListView extends View { OnTouchingLetterChangedListener onTouching

Android开发之自定义View(视图)用法详解

本文实例讲述了Android开发之自定义View(视图)用法.分享给大家供大家参考,具体如下: View类是Android的一个超类,这个类几乎包含了所有的屏幕类型.每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展.在游戏开发中往往需要自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要.在Android中,任何一个View类都只需重写onDraw 方法来实现界面显示,自定义的视图可以是复杂的3D实现,也可以是非常简单的文本形式等. 为了实现自定义View,需要创建