0

在我的应用程序中,我有一项服务,我在其中创建了一个使用 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下的galaxy y上失败了: 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))然后重新添加它,但它会导致屏幕闪烁,所以这是不可接受的......

4

1 回答 1

1

这是一种 hack,但由于各种 Android 版本的 alpha 变化,我经常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();`
于 2013-05-09T19:37:45.317 回答