2017/10/31 天气晴 温度适宜敲代码。
在做项目的时候,需要针对平板用户,将个别页面修改成弹窗样式,就是四周空间留半透明,中间显示内容。
但我全都用activity写好了啊,难道要一个个改成Dailog?肯定不可能,所以就想着在主题上下手脚。
注意:透明主题的Activity的Onclick事件会穿透到底层的Activty,所以1、需要给可用部分的View设置setOnclickListener监听器,2、如果不行就直接接设置onTouchListener,然后返回true。
这个很容易实现,网上一搜,一大堆,就是在AndroidManifest.xml里面,为需要修改的activity增加theme标签,标签内容引用style里的主题。
透明主题style是:
这里需要注意几个问题:
1、必须要parent="AppTheme",因为不用这个的话,有很多属性就都会没有,Activity也不支持,导致报错。
2、android:windowAnimationStyle里面的动画可以自己自定义,但自定义的属性必须继承@android:style/Animation.Translucent
自定义动画不起作用?请参照如下配置
说明一下:
1、必须要parent="@android:style/Animation.Translucent",网上看一人说的,说起来或者不用也行,你们试试。
2、上面两个@null,是因为Animation.Translucent里面的android:windowEnterAnimation和android:windowExitAnimation会与下面的4个动画冲突,会导致Activity有被打开两次,退出两次的现象。
3、如果是弹窗,下面的openExit和closeEnter可以设置为@anim/null。
这样设置之后,你可能会发现,退出动画依然无效,请参照以下方法:
重写finish()方法,增加以下代码
overridePendingTransition(R.anim.app_windows_anim_enter,R.anim.app_windows_anim_exit);
好了,到这个时候,动画应该是可以正常显示了。
但有时候我们需要的效果并不是整一个弹窗一起动,而是大的透明背景渐变出现,中间的内容却需要以一种放大显示,缩小消失的方式来作为动画,这个时候单单设置activity的属性是无法达到这个需求的 。请看。
1、先将Activity的动画换成渐变出现,渐变消失。
2、给中间所有的View包括起来,然后显示的时候给这个大View单独增加动画。
onCreate():
Animation animation=AnimationUtils.loadAnimation(context,R.anim.app_windows_content_anim_enter);
ll_index.setAnimation(animation);
ll_index.startAnimation(animation);
3、消失的时候,需要重写finish(),
Animation animation=AnimationUtils.loadAnimation(context,R.anim.app_windows_content_anim_exit);
ll_index.setAnimation(animation);
ll_index.startAnimation(animation);
animation.setAnimationListener(newAnimation.AnimationListener() {
@Override
public voidonAnimationStart(Animationanimation) {
}
@Override
public voidonAnimationEnd(Animationanimation) {
SubscribeActivity.super.finish();
overridePendingTransition(R.anim.app_windows_anim_enter,R.anim.app_windows_anim_exit);
}
@Override
public voidonAnimationRepeat(Animationanimation) {
}
});
然后送上检测是否是平板的代码。
if((context.getResources().getConfiguration().screenLayout&Configuration.SCREENLAYOUT_SIZE_MASK) >=Configuration.SCREENLAYOUT_SIZE_LARGE)
基本没有问题了。谢谢。