版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

仿MIUI的带有动画的Toast

效果图

 ToastMiui【仿MIUI的带有动画的Toast】

代码分析

  • ToastMiui类基于WindowManager

  • 为了和Toast用法保持一致,ToastMiui类中也使用了makeText、show、setGravity、setText方法。方便在项目中直接替换Toast。

使用步骤

一、项目组织结构图

 ToastMiui【仿MIUI的带有动画的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;
        }
    }  
}
ToastMiui.java

相关文章:

  • 2022-12-23
  • 2021-08-26
  • 2021-10-11
  • 2021-07-03
  • 2022-12-23
  • 2021-12-17
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-14
  • 2022-12-23
  • 2021-11-24
  • 2022-12-23
  • 2022-12-23
  • 2022-01-23
相关资源
相似解决方案