如何获取小于 19 的 API 的 Drawable 的 alpha 值

Posted

技术标签:

【中文标题】如何获取小于 19 的 API 的 Drawable 的 alpha 值【英文标题】:How to get the alpha value of a Drawable for api less than 19 【发布时间】:2014-10-26 14:02:30 【问题描述】:

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

我也有 NineOldandroids 库,但 getAlpha() 仅适用于 VIEWS。

【问题讨论】:

【参考方案1】:

没有获取 API 19 的 Drawable 先验的 alpha 值的通用方法。 反正根据你的Drawable是什么类型的,你可以查看源代码来扣除alpha有一个变通方法。

例如查看ColorDrawable 源很容易看出您可以在 Kitkat 之前移植实现。

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

所以drawable.getAlpha() 变成了drawble.getColor() >>> 24

编辑:

这是一个不完整尝试制作一个兼容方法,我会尝试随着时间的推移更新它:

    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;

【讨论】:

我建议先插入if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) return drawable.getAlpha(); return innerDrawable == null ? 255 : getAlphaCompat(innerDrawable) 对应于RotateDrawableScaleDrawable,其中innerDrawabledrawable.getDrawable()【参考方案2】:

将此库添加到 build.gradle 依赖项部分:

com.android.support:support-v4:24.0.0

下一个方法在 API 级别 4 及更高级别可用:

DrawableCompat.getAlpha(Drawable d)

[编辑] 注意 DrawableCompat.getAlpha 仅返回 0 用于低于 19 的版本。See source code

【讨论】:

对于 pre-19/KitKat SDK 的实现只是 return 0; - 注意这不会在 KitKat 之前返回实际的 alpha 值。【参考方案3】:

试试这个方法,希望能帮助你解决问题。

        if(Build.VERSION.SDK_INT<Build.VERSION_CODES.HONEYCOMB)
            v.setAlpha((Math.round(alpha*255)));
        else
            v.setAlpha(alpha);
        

【讨论】:

我要求获取 alpha 值,但没有设置它。 setAlpha 可从 API 1 获得。

以上是关于如何获取小于 19 的 API 的 Drawable 的 alpha 值的主要内容,如果未能解决你的问题,请参考以下文章

如何通过传递变量(参数)来获取api数据?

如何通过天气 api 获取降水/降雨?

如何从 OMDb API Web 服务获取数据

Coinbase API:如何获取所有受支持硬币的现货价格

使用 API 19(特别是 S5)使用位置服务获取 nullpointerexception

如何获取百度地图API的密钥以及调用百度地图API