美文网首页
Tween实战-Toast动画

Tween实战-Toast动画

作者: Method | 来源:发表于2021-06-07 16:54 被阅读0次
toast.gif

自定义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>

相关文章

网友评论

      本文标题:Tween实战-Toast动画

      本文链接:https://www.haomeiwen.com/subject/lzvceltx.html