android - 如何获取小于 19 的 Drawable 的 alpha 值

标签 android android-drawable alpha android-api-levels

我的 Activity 中有一个可绘制对象。可绘制对象的 setAlpha() 是在 API 级别 1 中引入的,而 getAlpha() 是在 API 级别 19 (KitKat) 中引入的。是否有任何替代 API 或支持库来获取可绘制对象的 alpha/不透明度值。

我还有 NineOldAndroids 库,但 getAlpha() 仅适用于 VIEWS。

最佳答案

在 API 19 之前,没有通用的方法来获取 Drawable 的 alpha 值。 不管怎样,根据你有什么样的Drawable,你可以查看源代码以使用变通方法扣除alpha。

例如查看 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;
}

关于android - 如何获取小于 19 的 Drawable 的 alpha 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25621126/

相关文章:

android - 设备文件资源管理器中的数据库文件夹为空 - ROOM 数据库

java - 将 C 代码移植到 Android

java - 错误 : make. exe:***没有规则可创建目标

android - 为什么我不能从适配器调用方法?

android - 我无法创建文件夹drawable-xxxhdpi

android,在 KitKat 上工作时背景资源在 ICS 上变黑

ffmpeg - 带 Alpha channel 的自适应视频编码

xcode - UIButton 在被按下时不会改变其 alpha

android - 当背景为黑色时,位图 setPixels 将丢失 alpha channel