
自定义Toast
public class MiuiToast {
public Boolean mShowTime;
public WindowManager mWdm;
public boolean mIsShow;
public View mToastView;
public Timer mTimer;
public WindowManager.LayoutParams mParams;
private MiuiToast(Context context, String text, boolean showTime ){
mShowTime = showTime;//记录Toast的显示长短类型
mIsShow = false;//记录当前Toast的内容是否已经在显示
mWdm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
//通过Toast实例获取当前android系统的默认Toast的View布局
mToastView = Toast.makeText(context, text, Toast.LENGTH_SHORT).getView();
mTimer = new Timer();
//设置布局参数
setParams();
}
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.ToastAnimation;//设置进入退出动画效果
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
mParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
mParams.gravity = Gravity.TOP;
mParams.y = 250;
mWdm.addView(mToastView, mParams);//将其加载到windowManager上
}
public void show(){
if(!mIsShow){//如果Toast没有显示,则开始加载显示
mIsShow = true;
mTimer.schedule(new TimerTask() {
@Override
public void run() {
mWdm.removeView(mToastView);
mIsShow = false;
}
}, (long)(mShowTime ? 3500 : 2000));
}
}
public static MiuiToast MakeText(Context context, String text, boolean showTime) {
MiuiToast result = new MiuiToast(context, text, showTime);
return result;
}
}
这里并不是创建一个自定义Toast,而是把toast添加到一个window中,对这个window设置动画,实现从顶步落下的效果。
<style name="ToastAnimation" parent="@android:style/Animation.Activity">
<!-- 定义Toast进出场动画 -->
<item name="android:windowEnterAnimation">@anim/anim_toast_enter</item>
<item name="android:windowExitAnimation">@anim/anim_toast_exit</item>
</style>
anim_toast_enter
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--快速跳转到指定位置-->
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="-105"
android:duration="1"
/>
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="105"
android:duration="550"
android:fillAfter="true"
android:interpolator="@android:anim/decelerate_interpolator"
/>
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="100"
/>
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="20"
android:duration="80"
android:fillAfter="true"
android:startOffset="350"
/>
</set>
anim_toast_exit
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="1"
android:toAlpha="0"
android:duration="800"/>
</set>
网友评论