如何获得api小于19的Drawable的alpha值

时间:2014-09-02 10:23:41

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

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

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

3 个答案:

答案 0 :(得分:6)

在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;
}

答案 1 :(得分:5)

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

com.android.support:support-v4:24.0.0

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

DrawableCompat.getAlpha(Drawable d)

[修改] 注意 DrawableCompat.getAlpha只返回0以下19版本。See source code

答案 2 :(得分:-2)

试试这种方式,希望这可以帮助您解决问题。

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