WindowManager.LayoutParams alpha问题

时间:2013-05-09 18:36:56

标签: android opacity android-view alpha android-windowmanager

在我的应用中,我有一项服务,我使用WindowManger创建一个视图:

    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);

问题是它在android 4.2.2下的我的galaxy s3上运行得非常好,在android 2.3.6下的我的Galaxy ace上,在android 2.3.3下的模拟器上但它在我的星系下失败了android 2.3.3:alpha不能设置为1到0之间的值,因此它要么完全透明(0)要么完全不透明(1)。 我的问题是:有没有人有同样的问题?是否只有这款手机才会出现?有没有办法解决它或任何其他方式来改变不透明度? 我已经在网上搜索了很长时间,但似乎没有人经历过同样的事情...... 我通过直接设置视图的不透明度找到了“half”的解决方法:

    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)),然后重新添加它,但它会导致屏幕闪烁,因此无法接受...

1 个答案:

答案 0 :(得分:1)

这是某种黑客攻击,但由于各种Android版本中的alpha更改,我经常使用AlphaAnimation来设置View的不透明度,因此即使在较旧的平台上也是如此。

试一试:

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