Альфа-проблема с WindowManager.LayoutParams

В моем приложении есть служба, в которой я создаю представление, которое отображаю с помощью 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);

Проблема в том, что он отлично работает на моем galaxy s3 под android 4.2.2, на моем galaxy ace под android 2.3.6, на эмуляторе под android 2.3.3 НО не работает на моем galaxy y под android 2.3. 3: для альфа-канала нельзя установить значение от 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)), а затем снова добавить, но экран мигает, поэтому это неприемлемо...


person Sébastien Morand    schedule 09.05.2013    source источник
comment
не могли бы вы поделиться своим решением?   -  person Meghal Agrawal    schedule 21.06.2016


Ответы (1)


Это своего рода хак, но из-за альфа-изменений в различных версиях Android я часто использую 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();`
person fish    schedule 09.05.2013
comment
Ваш ответ сработал после некоторого исправления, но я, наконец, добился того, что искал, добавив свое представление в FrameLayout, а затем установил его непрозрачность с помощью view.getBackground().setAlpha(alpha), а затем сделал представление недействительным. Это не полностью отвечает на мою проблему, потому что я хотел бы использовать WindowManger.LayoutParams.alpha... В любом случае спасибо. - person Sébastien Morand; 10.05.2013
comment
Это не работает, когда пользователь отключает анимацию устройства. - person Denny; 13.04.2017