如何获取小于 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)
对应于RotateDrawable
和ScaleDrawable
,其中innerDrawable
是drawable.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 值的主要内容,如果未能解决你的问题,请参考以下文章