`

Android自定义Toast

 
阅读更多

转于:http://blog.csdn.net/zhangweiwtmdbf/article/details/30031015

-------------------------------------------------------------------------------------------

一、引言

在开发的过程中你会发现Android自身的Toast提示有许多限制,比如我想自定义Toast的动画、自定义一个美观的View显示在Toast中、更多的是让Toast显示指定的时长等等。

首先一下效果如何:

 

二、原理

自定义的原理也很简单,就是给WindowManager添加View和删除View,不过需要设置WindowManager.LayoutParams和View的样式,使其看起来和Android系统的Toast看起来很相像。

具体代码如下:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. /** 
  2.  * Custom Toast 
  3.  *  
  4.  * @author Lucky 
  5.  *  
  6.  */  
  7. public class ToastHelper {  
  8.     public static final int LENGTH_LONG = 3500;  
  9.     public static final int LENGTH_SHORT = 2000;  
  10.     private WindowManager mWindowManager;  
  11.     private WindowManager.LayoutParams mWindowParams;  
  12.     private View toastView;  
  13.     private Context mContext;  
  14.     private Handler mHandler;  
  15.     private String mToastContent = "";  
  16.     private int duration = 0;  
  17.     private int animStyleId = android.R.style.Animation_Toast;  
  18.   
  19.     private final Runnable timerRunnable = new Runnable() {  
  20.   
  21.         @Override  
  22.         public void run() {  
  23.             removeView();  
  24.         }  
  25.     };  
  26.   
  27.     private ToastHelper(Context context) {  
  28.         // Notice: we should get application context  
  29.         // otherwise we will get error  
  30.         // "Activity has leaked window that was originally added"  
  31.         Context ctx = context.getApplicationContext();  
  32.         if (ctx == null) {  
  33.             ctx = context;  
  34.         }  
  35.         this.mContext = ctx;  
  36.         mWindowManager = (WindowManager) mContext  
  37.                 .getSystemService(Context.WINDOW_SERVICE);  
  38.         init();  
  39.     }  
  40.   
  41.     private void init() {  
  42.         mWindowParams = new WindowManager.LayoutParams();  
  43.         mWindowParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON  
  44.                 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE  
  45.                 | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;  
  46.         mWindowParams.alpha = 1.0f;  
  47.         mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;  
  48.         mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;  
  49.         mWindowParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;  
  50.         mWindowParams.format = PixelFormat.TRANSLUCENT;  
  51.         mWindowParams.type = WindowManager.LayoutParams.TYPE_TOAST;  
  52.         mWindowParams.setTitle("ToastHelper");  
  53.         mWindowParams.packageName = mContext.getPackageName();  
  54.         mWindowParams.windowAnimations = animStyleId;// TODO  
  55.         mWindowParams.y = mContext.getResources().getDisplayMetrics().widthPixels / 5;  
  56.     }  
  57.   
  58.     @SuppressWarnings("deprecation")  
  59.     @SuppressLint("NewApi")  
  60.     private View getDefaultToastView() {  
  61.   
  62.         TextView view = new TextView(mContext);  
  63.         view.setText(mToastContent);  
  64.         view.setGravity(Gravity.CENTER_VERTICAL | Gravity.START);  
  65.         view.setFocusable(false);  
  66.         view.setClickable(false);  
  67.         view.setFocusableInTouchMode(false);  
  68.         view.setTextColor(android.graphics.Color.WHITE);  
  69.         Drawable drawable = mContext.getResources().getDrawable(  
  70.                 android.R.drawable.toast_frame);  
  71.   
  72.         if (Build.VERSION.SDK_INT < 16) {  
  73.             view.setBackgroundDrawable(drawable);  
  74.         } else {  
  75.             view.setBackground(drawable);  
  76.         }  
  77.         return view;  
  78.     }  
  79.   
  80.     public void show() {  
  81.         removeView();  
  82.         if (toastView == null) {  
  83.             toastView = getDefaultToastView();  
  84.         }  
  85.         mWindowParams.gravity = android.support.v4.view.GravityCompat  
  86.                 .getAbsoluteGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM,  
  87.                         android.support.v4.view.ViewCompat  
  88.                                 .getLayoutDirection(toastView));  
  89.         removeView();  
  90.         mWindowManager.addView(toastView, mWindowParams);  
  91.         if (mHandler == null) {  
  92.             mHandler = new Handler();  
  93.         }  
  94.         mHandler.postDelayed(timerRunnable, duration);  
  95.     }  
  96.   
  97.     public void removeView() {  
  98.         if (toastView != null && toastView.getParent() != null) {  
  99.             mWindowManager.removeView(toastView);  
  100.             mHandler.removeCallbacks(timerRunnable);  
  101.         }  
  102.     }  
  103.   
  104.     /** 
  105.      * @param context 
  106.      * @param content 
  107.      * @param duration 
  108.      * @return 
  109.      */  
  110.     public static ToastHelper makeText(Context context, String content,  
  111.             int duration) {  
  112.         ToastHelper helper = new ToastHelper(context);  
  113.         helper.setDuration(duration);  
  114.         helper.setContent(content);  
  115.         return helper;  
  116.     }  
  117.   
  118.     /** 
  119.      * @param context 
  120.      * @param strId 
  121.      * @param duration 
  122.      * @return 
  123.      */  
  124.     public static ToastHelper makeText(Context context, int strId, int duration) {  
  125.         ToastHelper helper = new ToastHelper(context);  
  126.         helper.setDuration(duration);  
  127.         helper.setContent(context.getString(strId));  
  128.         return helper;  
  129.     }  
  130.   
  131.     public ToastHelper setContent(String content) {  
  132.         this.mToastContent = content;  
  133.         return this;  
  134.     }  
  135.   
  136.     public ToastHelper setDuration(int duration) {  
  137.         this.duration = duration;  
  138.         return this;  
  139.     }  
  140.   
  141.     public ToastHelper setAnimation(int animStyleId) {  
  142.         this.animStyleId = animStyleId;  
  143.         mWindowParams.windowAnimations = this.animStyleId;  
  144.         return this;  
  145.     }  
  146.   
  147.     /** 
  148.      * custom view 
  149.      *  
  150.      * @param view 
  151.      */  
  152.     public ToastHelper setView(View view) {  
  153.         this.toastView = view;  
  154.         return this;  
  155.     }  
  156. }  


另外分享一个自定义的Anim:

 

1.显示Toast的动画:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:duration="300"  
  4.     android:fillAfter="true" >  
  5.   
  6.     <alpha  
  7.         android:fromAlpha="0.0"  
  8.         android:toAlpha="1.0" />  
  9.   
  10.     <translate  
  11.         android:fromYDelta="20%"  
  12.         android:toYDelta="0%" />  
  13.   
  14.     <scale  
  15.         android:fromXScale="0.5"  
  16.         android:fromYScale="0.5"  
  17.         android:pivotX="50%"  
  18.         android:pivotY="50%"  
  19.         android:toXScale="1.0"  
  20.         android:toYScale="1.0" />  
  21.   
  22. </set>  


2.退出Toast的动画:

 

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:duration="300"  
  3.     android:fillAfter="true" >  
  4.   
  5.     <alpha  
  6.         android:fromAlpha="1.0"  
  7.         android:toAlpha="0.0" />  
  8.   
  9.     <translate  
  10.         android:fromYDelta="0%"  
  11.         android:toYDelta="20%" />  
  12.   
  13. </set>  



 

给WIndowManager中的View添加动画需要定义一个style,如下:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <style name="PopToast">  
  2.     <item name="@android:windowEnterAnimation">@anim/anim_toast_enter</item>  
  3.     <item name="@android:windowExitAnimation">@anim/anim_toast_exit</item>  
  4. </style>  


最后可以按照如下的方式去使用:

 

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. ToastHelper  
  2.                     .makeText(this"hello world 你好,哈拉雷速度发说得对",  
  3.                             ToastHelper.LENGTH_SHORT)  
  4.                     .setAnimation(R.style.PopToast).show();  



 

三、参考资料:

SuperToast: https://github.com/JohnPersano/SuperToasts

 

 

分享到:
评论

相关推荐

    android自定义Toast设定显示时间

    Android 自定义 Toast 设定显示时间是指在 Android 应用程序中,自定义 Toast 的显示时间,而不是使用系统默认的 Toast.LENGTH_SHORT 或 Toast.LENGTH_LONG。本文将详细介绍如何使用 WindowManager 实现自定义 Toast...

    android开发之自定义Toast

    一个简单的自定义Toast资源,您可以根据自己的需要更改我的代码即可实现您想要的效果(主要是更改xml文件的布局),这是androidstudio的项目,但是不妨碍在eclipse中使用,可以直接在eclipse中新建android项目,然后将...

    android 自定义toast

    本文将深入探讨如何在Android中自定义Toast,包括自定义显示时间和样式。 ### 一、自定义显示时间 系统默认的Toast显示时间分为短时间和长时间,但这些预设值可能并不符合特定场景的需求。要自定义显示时间,我们...

    Android 自定义 Toast 显示时间

    Android 自定义 Toast 显示时间 Android 自定义 Toast 显示时间是 Android 开发中的一个重要知识点。Toast 是 Android 中的一种常见的提示信息,通常用于显示一些短暂的信息。但是,Android 的默认 Toast 显示时间...

    Android自定义Toast提示信息工具类

    Android自定义Toast提示信息工具类,可以实现如下功能: 1、最简单Toast显示 2、自定义图标、图标颜色 3、自定义文本颜色 4、自定义背景颜色 5、设置组件水平、垂直显示位置 6、设置边框宽度、边框颜色

    Android 自定义Toast

    总结起来,Android自定义Toast允许开发者根据项目需求打造独特的提示效果。通过创建自定义布局、自定义类和应用各种视觉特效,我们可以使Toast更具吸引力和用户体验。在实际开发中,善用这些技巧能提升应用程序的...

    Android中自定义Toast背景颜色及字体颜色,防止Toast多次创建的ToastUtil

    Android中自定义Toast背景颜色及字体颜色,防止Toast多次创建的ToastUtil,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/68962539

    Android Toast 自定义背景、图片 随心使用

    本篇文章将深入探讨如何在Android中自定义`Toast`的背景和添加图片,以实现更加个性化的用户体验。 首先,我们要了解`Toast`的基本用法。在Android中,我们可以通过`Toast.makeText()`方法来创建一个`Toast`实例,...

    android 自定义修改toast显示时间

    /* 显示toast,自己定义显示长短。 * param1:activity 传入context * param2:word 我们需要显示的toast的内容 * param3:time length long类型,我们传入的时间长度(如500)*/

    Android-Android实现Toast自定义样式

    // 实现上述自定义Toast的逻辑 } public static void showToast(Context context, String text, int duration) { // 调用系统的简单Toast } } ``` 通过这个工具类,可以在整个项目中方便地调用自定义`Toast`...

    Android 自定义toast显示效果实例.rar

    Android 源码演示5种toast显示效果,一共是以下几种演示:默认的Toast显示、自定义位置的Toast显示、带图片的Toast显示、完全自定义的Toast显示、长时间的Toast显示,Android 自定义5种toast显示效果。有的Toast效果...

    Android自定义toast

    因此,自定义Toast成为了Android应用中提升用户体验的一种常见手段。本篇文章将详细探讨如何在Android中实现自定义Toast,使其既简单、美观又实用。 首先,我们需要了解Toast的基本使用。在Android中,我们通常通过...

    自定义Toast,设置Toast显示位置,自定义Toast的复杂布局

    当我们需要更复杂的交互或者定制化设计时,就需要自定义Toast。本篇文章将深入探讨如何自定义Toast,设置其显示位置,并构建复杂的布局。 首先,让我们了解自定义Toast的基本步骤: 1. **创建自定义布局文件**: ...

    Android-自定义Toast解决系统Toast存在的问题

    本文将深入探讨如何在Android中自定义Toast,并提供相应的代码示例。 首先,让我们了解系统Toast的基本用法。在Android SDK中,Toast类提供了show()方法来显示一个消息。通常,我们通过以下方式创建和显示一个系统...

    Android中自定义Toast.pdf

    本文将详细介绍如何在Android中自定义Toast。 首先,我们来看如何修改Toast的位置。在Android中,可以使用`setGravity()`方法来改变Toast的显示位置。例如,以下代码将Toast的位置设置为屏幕中央: ```java Toast ...

    Android自定义Toast之WindowManager

    Android 自定义 Toast 之 WindowManager Android 自定义 Toast 之 WindowManager 是 Android 开发中的一种常见技术,用于在应用程序中显示自定义的 Toast 消息。本文将详细介绍 Android 自定义 Toast 之 ...

Global site tag (gtag.js) - Google Analytics