Как я могу установить альфа-значение для всего представления на уровне api 7 (Android 2.1)

#android #transparency #transition #alpha

#Android #прозрачность #переход #альфа

Вопрос:

У меня есть произвольное представление, которое я хочу скрыть поверх другого представления. На уровне api 11 я вижу, что есть setAlpha, но я застрял на поддержке уровня api 7. Я не сталкивался с простым способом сделать это. Как я могу установить альфа-значение для всего вида, не вмешиваясь в каждый отдельный компонент?

Ответ №1:

Вы должны быть в состоянии достичь разумного эффекта, используя AlphaAnimation на уровне API 7.

     View v = findViewById(R.id.view2);

    AlphaAnimation aa = new AlphaAnimation(0f,1f);
    aa.setDuration(5000);
    v.startAnimation(aa);
  

Комментарии:

1. Ах, черт… Я не часто использую анимацию. Это определенно правильный путь. Я смиренно добавляю свой голос «за».

2. @Maximus @slund проверьте это! Я понял, как сделать альфа-версию в целом.

3. Чтобы добавить к этому: используя потрясающую библиотеку NineOldAndroids, она также работает в двух строках кода.

Ответ №2:

Использование AlphaAnimation было бы отличным решением для большинства переходов и, безусловно, сработало бы для меня, если бы я не смог найти способ сделать именно то, что я пытался сделать, что включает постепенное переход от одного вида к другому в зависимости от угла наклона устройства. К счастью, у меня есть! Вот стратегия, которую я выбрал: я заключил представление в пользовательский подкласс FrameLayout и реализовал onDraw. Там я записал дочерний вид в виде растрового изображения, а затем перерисовал растровое изображение с предполагаемой альфой. Вот некоторый код. Я отредактирую, когда буду очищен, это просто доказательство концепции, но работает как шарм:

 public class AlphaView extends FrameLayout {
    private int alpha = 255;

    public AlphaView(Context context) {
        super(context);
        setWillNotDraw(false);
    }

    public AlphaView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setWillNotDraw(false);
    }

    public AlphaView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setWillNotDraw(false);
    }

    public void setCustomAlpha(int alpha) {
        if (this.alpha != alpha) {
            this.alpha = alpha;
            invalidate();
        }
    }

    public int getCustomAlpha() {
        return alpha;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        for(int index = 0; index < getChildCount(); index   ) {
            View child  = getChildAt(index);
            child.setVisibility(View.INVISIBLE);
            child.setDrawingCacheEnabled(true);
            Bitmap bitmap = child.getDrawingCache(true);
            bitmap = Bitmap.createBitmap(bitmap);
            child.setDrawingCacheEnabled(false);
            Paint paint = new Paint();
            paint.setAlpha(alpha);
            canvas.drawBitmap(bitmap, 0, 0, paint);
        }
    }
}
  

Комментарии:

1. Ничего, что я заметил. Ваши результаты могут отличаться.

Ответ №3:

Это будет зависеть от типа представления.

Для TextView в xml у вас могут быть следующие атрибуты:

 android:background="#00000000"
android:textColor="#77FFFFFF"
  

Первые два числа — это альфа-значения от 00 до FF (в шестнадцатеричном формате).
Фон был бы полностью прозрачным, в то время как текст был бы белым и частично прозрачным. Я не тестировал это, но это должно сработать.

Если у вас есть фон, представляющий собой изображение, то проще всего предварительно создать изображение в формате png с прозрачностью.

Комментарии:

1. У меня есть несколько представлений разных видов (некоторые нарисованные на заказ), которые все находятся вместе в одном RelativeLayout. Я хотел бы иметь возможность устанавливать альфа-значение для RelativeLayout и не связываться со всеми многочисленными дочерними элементами.

2. Я не верю, что это возможно с уровнем API 7… но если кто-то еще знает лучше, им придется прийти и поделиться решением…

3. Без сомнения, благодаря ответу Слунда я понимаю, что вылетело у меня из головы.

4. К сожалению, в Android… «Все возможно» на самом деле не соответствует действительности.