在默认的android系统中,Toast的位置默认是在屏幕正下方。但是开发过程中,可能需要将Toast显示在不同的位置,这时就需要重定义Toast的位置。可以分为两个方面,一个是从应用层控制,另一个是从系统层来控制;
目录
1,应用层控制Toast位置
2,系统层统一控制Toast位置
1,应用层控制Toast位置
Toast.java提供了setGravity()方法,官方文档中该方法是这样描述的:
public void setGravity(int gravity, int xOffset, int yOffset) {
throw new RuntimeException(“Stub!”);
}
**第一个参数:**表示具体的位置,可以使用Gravity.CENTER、Gravity.TOP、Gravity.LEFT等表示;
**第二个参数:**表示可移动的方向,左右方向,如果想向右移动,设置改参数大于0就可以了,如果是0则不移动;
**第三个参数:**它的功能与第二个参数相同,它表示上下方向,如果想向下移动,增大该参数就可以了;
注意:后两个参数的单位都指的是像素
使用实例如下:
Toast mToast =Toast.makeText(this,"this is a toast",Toast.LENGTH_LONG);
mToast.setGravity(Gravity.CENTER,100,280);
mToast.show();
2,系统层统一控制Toast位置
对于一个完整的系统开发来说,不同的项目可能对Toast的弹出位置有着不同的定义,比如有的项目希望所有的toast弹出位置固定在屏幕正上方。这种需求,APP可以通过上面的做法完整,但是缺点是每个APP都需要适配,所以最合适的做法应该是从系统层直接写死。
根据上面提供给App的方法参数,可以判定是需要从系统层修改Gravity信息和X、Y坐标即可,只需要修改文件Toast.java;
public Toast(@NonNull Context context, @Nullable Looper looper) {
mContext = context;
mTN = new TN(context.getPackageName(), looper);
mTN.mY = context.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.toast_y_offset);
mTN.mGravity = context.getResources().getInteger(
com.android.internal.R.integer.config_toastDefaultGravity);
mTN.mGravity = Gravity.CENTER;//重定义gravity信息
}
然后重写写死x、y坐标即可:
public void handleShow(IBinder windowToken) {
... ...
if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) {
mParams.verticalWeight = 1.0f;
}
mParams.x = mX;
mParams.y = mY;
mParams.x = 100; //重写x坐标
mParams.y = 280;//重写Y坐标
... ...
}