转于:http://blog.csdn.net/zhangweiwtmdbf/article/details/30031015
-------------------------------------------------------------------------------------------
一、引言
在开发的过程中你会发现Android自身的Toast提示有许多限制,比如我想自定义Toast的动画、自定义一个美观的View显示在Toast中、更多的是让Toast显示指定的时长等等。
首先一下效果如何:
二、原理
自定义的原理也很简单,就是给WindowManager添加View和删除View,不过需要设置WindowManager.LayoutParams和View的样式,使其看起来和Android系统的Toast看起来很相像。
具体代码如下:
- /**
- * Custom Toast
- *
- * @author Lucky
- *
- */
- public class ToastHelper {
- public static final int LENGTH_LONG = 3500;
- public static final int LENGTH_SHORT = 2000;
- private WindowManager mWindowManager;
- private WindowManager.LayoutParams mWindowParams;
- private View toastView;
- private Context mContext;
- private Handler mHandler;
- private String mToastContent = "";
- private int duration = 0;
- private int animStyleId = android.R.style.Animation_Toast;
- private final Runnable timerRunnable = new Runnable() {
- @Override
- public void run() {
- removeView();
- }
- };
- private ToastHelper(Context context) {
- // Notice: we should get application context
- // otherwise we will get error
- // "Activity has leaked window that was originally added"
- Context ctx = context.getApplicationContext();
- if (ctx == null) {
- ctx = context;
- }
- this.mContext = ctx;
- mWindowManager = (WindowManager) mContext
- .getSystemService(Context.WINDOW_SERVICE);
- init();
- }
- private void init() {
- mWindowParams = new WindowManager.LayoutParams();
- mWindowParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
- mWindowParams.alpha = 1.0f;
- mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
- mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
- mWindowParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
- mWindowParams.format = PixelFormat.TRANSLUCENT;
- mWindowParams.type = WindowManager.LayoutParams.TYPE_TOAST;
- mWindowParams.setTitle("ToastHelper");
- mWindowParams.packageName = mContext.getPackageName();
- mWindowParams.windowAnimations = animStyleId;// TODO
- mWindowParams.y = mContext.getResources().getDisplayMetrics().widthPixels / 5;
- }
- @SuppressWarnings("deprecation")
- @SuppressLint("NewApi")
- private View getDefaultToastView() {
- TextView view = new TextView(mContext);
- view.setText(mToastContent);
- view.setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
- view.setFocusable(false);
- view.setClickable(false);
- view.setFocusableInTouchMode(false);
- view.setTextColor(android.graphics.Color.WHITE);
- Drawable drawable = mContext.getResources().getDrawable(
- android.R.drawable.toast_frame);
- if (Build.VERSION.SDK_INT < 16) {
- view.setBackgroundDrawable(drawable);
- } else {
- view.setBackground(drawable);
- }
- return view;
- }
- public void show() {
- removeView();
- if (toastView == null) {
- toastView = getDefaultToastView();
- }
- mWindowParams.gravity = android.support.v4.view.GravityCompat
- .getAbsoluteGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM,
- android.support.v4.view.ViewCompat
- .getLayoutDirection(toastView));
- removeView();
- mWindowManager.addView(toastView, mWindowParams);
- if (mHandler == null) {
- mHandler = new Handler();
- }
- mHandler.postDelayed(timerRunnable, duration);
- }
- public void removeView() {
- if (toastView != null && toastView.getParent() != null) {
- mWindowManager.removeView(toastView);
- mHandler.removeCallbacks(timerRunnable);
- }
- }
- /**
- * @param context
- * @param content
- * @param duration
- * @return
- */
- public static ToastHelper makeText(Context context, String content,
- int duration) {
- ToastHelper helper = new ToastHelper(context);
- helper.setDuration(duration);
- helper.setContent(content);
- return helper;
- }
- /**
- * @param context
- * @param strId
- * @param duration
- * @return
- */
- public static ToastHelper makeText(Context context, int strId, int duration) {
- ToastHelper helper = new ToastHelper(context);
- helper.setDuration(duration);
- helper.setContent(context.getString(strId));
- return helper;
- }
- public ToastHelper setContent(String content) {
- this.mToastContent = content;
- return this;
- }
- public ToastHelper setDuration(int duration) {
- this.duration = duration;
- return this;
- }
- public ToastHelper setAnimation(int animStyleId) {
- this.animStyleId = animStyleId;
- mWindowParams.windowAnimations = this.animStyleId;
- return this;
- }
- /**
- * custom view
- *
- * @param view
- */
- public ToastHelper setView(View view) {
- this.toastView = view;
- return this;
- }
- }
另外分享一个自定义的Anim:
1.显示Toast的动画:
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="300"
- android:fillAfter="true" >
- <alpha
- android:fromAlpha="0.0"
- android:toAlpha="1.0" />
- <translate
- android:fromYDelta="20%"
- android:toYDelta="0%" />
- <scale
- android:fromXScale="0.5"
- android:fromYScale="0.5"
- android:pivotX="50%"
- android:pivotY="50%"
- android:toXScale="1.0"
- android:toYScale="1.0" />
- </set>
2.退出Toast的动画:
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="300"
- android:fillAfter="true" >
- <alpha
- android:fromAlpha="1.0"
- android:toAlpha="0.0" />
- <translate
- android:fromYDelta="0%"
- android:toYDelta="20%" />
- </set>
给WIndowManager中的View添加动画需要定义一个style,如下:
- <style name="PopToast">
- <item name="@android:windowEnterAnimation">@anim/anim_toast_enter</item>
- <item name="@android:windowExitAnimation">@anim/anim_toast_exit</item>
- </style>
最后可以按照如下的方式去使用:
- ToastHelper
- .makeText(this, "hello world 你好,哈拉雷速度发说得对",
- ToastHelper.LENGTH_SHORT)
- .setAnimation(R.style.PopToast).show();
三、参考资料:
SuperToast: https://github.com/JohnPersano/SuperToasts
相关推荐
Android 自定义 Toast 设定显示时间是指在 Android 应用程序中,自定义 Toast 的显示时间,而不是使用系统默认的 Toast.LENGTH_SHORT 或 Toast.LENGTH_LONG。本文将详细介绍如何使用 WindowManager 实现自定义 Toast...
一个简单的自定义Toast资源,您可以根据自己的需要更改我的代码即可实现您想要的效果(主要是更改xml文件的布局),这是androidstudio的项目,但是不妨碍在eclipse中使用,可以直接在eclipse中新建android项目,然后将...
本文将深入探讨如何在Android中自定义Toast,包括自定义显示时间和样式。 ### 一、自定义显示时间 系统默认的Toast显示时间分为短时间和长时间,但这些预设值可能并不符合特定场景的需求。要自定义显示时间,我们...
Android 自定义 Toast 显示时间 Android 自定义 Toast 显示时间是 Android 开发中的一个重要知识点。Toast 是 Android 中的一种常见的提示信息,通常用于显示一些短暂的信息。但是,Android 的默认 Toast 显示时间...
Android自定义Toast提示信息工具类,可以实现如下功能: 1、最简单Toast显示 2、自定义图标、图标颜色 3、自定义文本颜色 4、自定义背景颜色 5、设置组件水平、垂直显示位置 6、设置边框宽度、边框颜色
总结起来,Android自定义Toast允许开发者根据项目需求打造独特的提示效果。通过创建自定义布局、自定义类和应用各种视觉特效,我们可以使Toast更具吸引力和用户体验。在实际开发中,善用这些技巧能提升应用程序的...
Android中自定义Toast背景颜色及字体颜色,防止Toast多次创建的ToastUtil,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/68962539
本篇文章将深入探讨如何在Android中自定义`Toast`的背景和添加图片,以实现更加个性化的用户体验。 首先,我们要了解`Toast`的基本用法。在Android中,我们可以通过`Toast.makeText()`方法来创建一个`Toast`实例,...
/* 显示toast,自己定义显示长短。 * param1:activity 传入context * param2:word 我们需要显示的toast的内容 * param3:time length long类型,我们传入的时间长度(如500)*/
// 实现上述自定义Toast的逻辑 } public static void showToast(Context context, String text, int duration) { // 调用系统的简单Toast } } ``` 通过这个工具类,可以在整个项目中方便地调用自定义`Toast`...
Android 源码演示5种toast显示效果,一共是以下几种演示:默认的Toast显示、自定义位置的Toast显示、带图片的Toast显示、完全自定义的Toast显示、长时间的Toast显示,Android 自定义5种toast显示效果。有的Toast效果...
因此,自定义Toast成为了Android应用中提升用户体验的一种常见手段。本篇文章将详细探讨如何在Android中实现自定义Toast,使其既简单、美观又实用。 首先,我们需要了解Toast的基本使用。在Android中,我们通常通过...
当我们需要更复杂的交互或者定制化设计时,就需要自定义Toast。本篇文章将深入探讨如何自定义Toast,设置其显示位置,并构建复杂的布局。 首先,让我们了解自定义Toast的基本步骤: 1. **创建自定义布局文件**: ...
本文将深入探讨如何在Android中自定义Toast,并提供相应的代码示例。 首先,让我们了解系统Toast的基本用法。在Android SDK中,Toast类提供了show()方法来显示一个消息。通常,我们通过以下方式创建和显示一个系统...
本文将详细介绍如何在Android中自定义Toast。 首先,我们来看如何修改Toast的位置。在Android中,可以使用`setGravity()`方法来改变Toast的显示位置。例如,以下代码将Toast的位置设置为屏幕中央: ```java Toast ...
Android 自定义 Toast 之 WindowManager Android 自定义 Toast 之 WindowManager 是 Android 开发中的一种常见技术,用于在应用程序中显示自定义的 Toast 消息。本文将详细介绍 Android 自定义 Toast 之 ...