版权声明:本文为HaiyuKing原创文章,转载请注明出处!
前言
仿MIUI的带有动画的Toast
效果图
代码分析
-
ToastMiui类基于WindowManager
- 为了和Toast用法保持一致,ToastMiui类中也使用了makeText、show、setGravity、setText方法。方便在项目中直接替换Toast。
使用步骤
一、项目组织结构图
注意事项:
1、 导入类文件后需要change包名以及重新import R文件路径
2、 Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖
二、导入步骤
将ToastMiui复制到项目中,并重新import R文件
package com.why.project.toastmiuidemo.views; import android.content.Context; import android.graphics.PixelFormat; import android.os.Handler; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.TextView; import com.why.project.toastmiuidemo.R; /** * CreateBy HaiyuKing * Used 仿MIUI的带有动画的Toast效果实现,基于WindowManager【可以控制显示样式、位置、显示时间、动画,不可触发】 * 注意 Toast布局在源码中的布局是采用LinearLayout */ public class ToastMiui { /**显示的时间(长)*/ public static final int LENGTH_LONG = 3500; /**显示的时间(短)*/ public static final int LENGTH_SHORT = 2000; private WindowManager mWindowManager;//整个Android的窗口机制是基于一个叫做 WindowManager private View mToastView; private WindowManager.LayoutParams mParams; private Handler mHandler; private Context mContext; private int mShowTime = LENGTH_SHORT;//记录Toast的显示长短类型LENGTH_LONG/LENGTH_SHORT private boolean mIsShow;//记录当前Toast的内容是否已经在显示 /** * 逻辑简单粗暴,直接调用构造函数实例化一个MiuiToast对象并返回。*/ public static ToastMiui MakeText(Context context, CharSequence text, int duration) { ToastMiui toastMiui = new ToastMiui(context, text, duration); return toastMiui; } public static ToastMiui MakeText(Context context, int toastStrId, int showTime) { ToastMiui toastMiui = new ToastMiui(context, context.getString(toastStrId), showTime); return toastMiui; } /**在构造方法中,更多的是对数据的初始化,由于设置布局参数比较多,所以单独抽出一个函数来*/ private ToastMiui(Context context, CharSequence text, int duration){ mContext = context; mShowTime = duration;//记录Toast的显示长短类型 mIsShow = false;//记录当前Toast的内容是否已经在显示 mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); //通过inflate获取自定义的Toast布局文件 mToastView = LayoutInflater.from(context).inflate(R.layout.toast_custom_view,null); TextView tv = (TextView) mToastView.findViewById(R.id.tv_toast); tv.setText(text); //设置布局参数 setParams(); } /**设置布局参数 * 这个设置参数更多是参考源代码中原生Toast的设置参数的类型 * 在这里我们需要注意的是 mParams.windowAnimations = R.style.anim_view;这个是我们这个仿MIUI的Toast动画实现的基石。*/ private void setParams() { mParams = new WindowManager.LayoutParams(); mParams.height = WindowManager.LayoutParams.WRAP_CONTENT; mParams.width = WindowManager.LayoutParams.WRAP_CONTENT; mParams.format = PixelFormat.TRANSLUCENT; mParams.windowAnimations = R.style.anim_view;//设置进入退出动画效果 mParams.type = WindowManager.LayoutParams.TYPE_TOAST; mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; mParams.alpha = 1.0f; mParams.setTitle("ToastMiui"); mParams.packageName = mContext.getPackageName(); mParams.gravity = Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM;//设置显示的位置 mParams.y = 50;//设置偏移量 } /** * 1、gravity是输入Toast需要显示的位置,例如CENTER_VERTICAL(垂直居中)、CENTER_HORIZONTAL(水平居中)、TOP(顶部)等等。 * 2、xOffset则是决定Toast在水平方向(x轴)的偏移量,偏移量单位为,大于0向右偏移,小于0向左偏移 * 3、yOffset决定Toast在垂直方向(y轴)的偏移量,大于0向下偏移,小于0向上偏移,想设大值也没关系,反正Toast不会跑出屏幕。*/ public void setGravity(int gravity, int xOffset, int yOffset) { mParams.gravity = gravity; mParams.x = xOffset; mParams.y = yOffset; } public void setText(CharSequence s){ TextView tv = (TextView) mToastView.findViewById(R.id.tv_toast); tv.setText(s); } public void setText(int resId){ TextView tv = (TextView) mToastView.findViewById(R.id.tv_toast); tv.setText(resId); } public void show() { if(!mIsShow) {//如果Toast没有显示,则开始加载显示 mIsShow = true; mWindowManager.addView(mToastView, mParams); if (mHandler == null) { mHandler = new Handler(); } mHandler.postDelayed(timerRunnable, mShowTime); } } private final Runnable timerRunnable = new Runnable() { @Override public void run() { removeView(); } }; public void removeView() { if (mToastView != null && mToastView.getParent() != null) { mWindowManager.removeView(mToastView); mHandler.removeCallbacks(timerRunnable); mIsShow = false; } } }