2013-05-09 130 views
0

在我的应用程序,我有我创造,我用WindowManger显示视图服务:WindowManager.LayoutParams阿尔法问题

mFilter = new View(this); 
    mFilter.setBackgroundColor(getResources().getColor(android.R.color.black)); 

    mParams = new WindowManager.LayoutParams(
     LayoutParams.TYPE_SYSTEM_OVERLAY, 
     LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
     PixelFormat.TRANSPARENT); // PixelFormat.TRANSLUCENT works as well 

    mWindowManager.addView(mFilter, mParams);

我希望能够动态地控制其不透明度这样:

mParams.alpha = alpha; // alpha is a float chosen by the user and varying from 0 to 1 
    mWindowManager.updateView(mFilter, mParams);

的问题是,它的工作原理非常清楚我的银河S3的android下的4.2.2,在我的星系王牌下的Android 2.3.6上的模拟器下的Android 2.3.3 但它在我的失败星系y在andr下oid 2.3.3:不能将alpha设置为1和0之间的值,因此它不是全透明(0)就是完全不透明(1)。 我的问题是:有没有人有同样的问题?它是否只出现在这款手机上?有没有办法解决这个问题或其他方式来改变不透明度? 我已经在网络上搜索了很久,但似乎没有人经历过同样的事情... 我发现了一个变通方法,“半”的工作原理是直接设置视图的不透明度:

mFilter.getBackground().setAlpha(alpha); // alpha is an int varying from 0 to 255

这次的问题是,在老版本的android上它可以工作,但是在api 10和更低版本上,即使我调用mFilter.postInvalidate()mWindowManager.updateView(mFilter, mParams),视图的不透明度也不会更新。我必须删除它(mWindowManager.removeView(mFilter)),然后再次添加它,但它会导致屏幕闪烁,因此它是不可接受的...

+0

可以ü请分享你的解决方案? – 2016-06-21 12:27:15

回答

1

这是某种黑客,但由于各种Android版本中的alpha更改I通常使用AlphaAnimation来设置视图的不透明度,因此即使在较旧的平台上这也是一种可靠的方法。

只要给它一个尝试:

float alpha = 0.5f; 
AlphaAnimation alphaAnimation = new AlphaAnimation(alpha, alpha); 
alphaAnimation.setStartTime(0); 
alphaAnimation.setDuration(0); 
alphaAnimation.setFillAfter(true); 
view.setAnimation(alphaAnimation); 
view.postInvalidate();` 
+0

你的答案在经过一些修正后仍然有效,但我最终在将视图添加到“FrameLayout”后,终于实现了我的目标,然后使用view.getBackground()。setAlpha(alpha)设置其不透明度,然后使视图无效。它不能完全回答我的问题,因为我想使用WindowManger.LayoutParams.alpha ...谢谢你。 – 2013-05-10 16:48:37

+0

当用户禁用设备动画时,这不起作用。 – Denny 2017-04-13 19:08:34