Как получить альфа-значение Drawable для API менее 19

У меня есть рисованный объект в моей деятельности. setAlpha() для рисования был введен в API уровня 1, но getAlpha() был представлен на уровне API 19(KitKat). Есть ли альтернативный API или вспомогательная библиотека для получения значения альфа / непрозрачности отрисовки.

А также у меня есть библиотека NineOldAndroids, но getAlpha() работает только для просмотров.

3 ответа

Не существует общего способа получить альфа-значение Drawable априори API 19. В любом случае, в зависимости от того, какой у вас Drawable, вы можете проверить исходный код, чтобы вычесть альфа с помощью обходного пути.

Например, глядя на источник ColorDrawable, легко увидеть, что вы можете портировать реализацию до Kitkat.

@Override
public int getAlpha() {
    return mColorState.mUseColor >>> 24;
}

так drawable.getAlpha() становится drawble.getColor() >>> 24

РЕДАКТИРОВАТЬ:

Вот неполная попытка сделать метод compat, я постараюсь обновить это со временем:

    public static int getAlphaCompat( Drawable drawable ) {
    if (VERSION.SDK_INT >= VERSION_CODES.KITKAT)
        return drawable.getAlpha();

    if( drawable instanceof ColorDrawable ) {
        return ((ColorDrawable) drawable).getColor() >>> 24;
    } else if( drawable instanceof BitmapDrawable ) {
        return ((BitmapDrawable) drawable).getPaint().getAlpha();
    } else if( drawable instanceof RotateDrawable ) {
        return getAlphaCompat( ((RotateDrawable) drawable).getDrawable() );
    } else if( drawable instanceof ScaleDrawable ) {
        return getAlphaCompat( ((ScaleDrawable) drawable).getDrawable() );
    } else if( drawable instanceof ClipDrawable ) {
        //TODO: possible with reflection
    } else if( drawable instanceof  ShapeDrawable ) {
        //TODO: possible with reflection
    } else if( drawable instanceof DrawableContainer ) {
       //TODO: possible with reflection
    } else if( drawable instanceof GradientDrawable ) {
        //TODO: possible with reflection
    }

    return -1;
}

Добавление этой библиотеки в раздел зависимостей build.gradle:

com.android.support:support-v4:24.0.0

Следующий метод становится доступным на уровне API 4 и выше:

DrawableCompat.getAlpha(Drawable d)

[Редактировать] Внимание DrawableCompat.getAlpha просто возвращается 0 для версий ниже 19. См. исходный код

Попробуйте таким образом, надеюсь, это поможет вам решить вашу проблему.

        if(Build.VERSION.SDK_INT<Build.VERSION_CODES.HONEYCOMB){
            v.setAlpha((Math.round(alpha*255)));
        }else{
            v.setAlpha(alpha);
        }
Другие вопросы по тегам