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

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

Ответы [ 3 ]

13 голосов
/ 26 апреля 2011

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

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

    AlphaAnimation aa = new AlphaAnimation(0f,1f);
    aa.setDuration(5000);
    v.startAnimation(aa);
5 голосов
/ 26 апреля 2011

Использование 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);
        }
    }
}
3 голосов
/ 26 апреля 2011

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

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

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

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

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

...