Как получить альфа-значение 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);
}