Toast-进阶

Toast 进阶

1.     Toast 普通自定义方式

这是stackoverflow上最多的答案,DEMO代码如下:

LayoutInflater inflater = getLayoutInflater();

View layout = inflater.inflate(R.layout.toast_layout,

                               (ViewGroup) findViewById(R.id.toast_layout_root));

 

ImageView image = (ImageView) layout.findViewById(R.id.image);

image.setImageResource(R.drawable.android);

TextView text = (TextView) layout.findViewById(R.id.text);

text.setText("Hello! This is a custom toast!");

 

Toast toast = new Toast(getApplicationContext());

toast.setGravity(Gravity.CENTER_VERTICAL, 00);

toast.setDuration(Toast.LENGTH_LONG);

toast.setView(layout);

toast.show();

 

2.     利用AlertDialog来自定义Toast

第一种方式其实很多情况是可以的,但是由于不同设备toast动画似乎不同(经过我们测试),举例下我们公司的一个应用场景,我们需要一个整个背景半透明的toast,但是用1方法,在有些设备由于它的Toast有抖动的效果,导致整个看过去屏幕也抖动了一下,后来我们决定用AlertDialog自定义,按原来的认知我们一直以为AlertDialog依赖于当前某个activity,才可以,这样比toast麻烦很多你需要关系activity是否被释放,于是乎我决定去研究下Toast源码,发现一个有意思的代码:

final WindowManager.LayoutParams params = mParams;

params.height = WindowManager.LayoutParams.WRAP_CONTENT;

params.width = WindowManager.LayoutParams.WRAP_CONTENT;

params.format = PixelFormat.TRANSLUCENT;

这句话可以指定动画

params.windowAnimations = com.android.internal.R.style.Animation_Toast;

这句话可以实现全局toast

params.type = WindowManager.LayoutParams.TYPE_TOAST;

params.setTitle("Toast");

params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

有了这句话你就可以用application context作为构建dialog的context,从而实现全局:

以下是我们的部分实现代码:

mToastStyle = toastStyle;
if
(mToast == null) {
 
mToast = new AlertDialog.Builder(MyApplication.getInstance()).create();
}
mToast.setOnKeyListener(new Dialog.OnKeyListener() {

 
@Override public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent event) {
   
if (keyCode == KeyEvent.KEYCODE_BACK) {
    }
   
return false;
 
}
})
;

mWindow = mToast.getWindow();
WindowManager.LayoutParams wmlp = mWindow.getAttributes();
wmlp.dimAmount = 0.5f;
mWindow.setAttributes(wmlp);
mWindow.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
mWindow.setBackgroundDrawableResource(R.drawable.transparent_drawable);
wmlp.type = WindowManager.LayoutParams.TYPE_TOAST;
mToast.setCancelable(true);
mToast.setCanceledOnTouchOutside(true);
mToast.show();
mWindow.setContentView(getLayoutByType(mToastStyle));
mWindow.setGravity(Gravity.CENTER);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值