gpt4 book ai didi

android - 从状态列表 drawable 中获取特定的 drawable

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:34 30 4
gpt4 key购买 nike

我有一个可绘制的状态列表,我想从可绘制的状态列表中获取一个特定的可绘制对象:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:kplus="http://schemas.android.com/apk/res-auto">


<item kplus:key_type_space_alt="true" android:state_pressed="true" android:drawable="@drawable/space_1_pressed" />
<item kplus:key_type_space_alt="true" android:drawable="@drawable/space_1_normal" />

<!-- TopNav keys. -->

<item kplus:key_type_topnav="true" android:state_pressed="true" android:drawable="@drawable/tab_down" />
<item kplus:key_type_topnav="true" android:state_selected="true" android:drawable="@drawable/tab_down" />
<item kplus:key_type_topnav="true" android:drawable="@drawable/tab_normal" />

<!-- TopRow keys. -->

<item kplus:key_type_toprow="true" android:state_pressed="true" android:drawable="@drawable/numeric_presseed" />
<item kplus:key_type_toprow="true" android:drawable="@drawable/numeric_normal" />
</selector>

我为每个键选择正确的可绘制状态,如下所示:

if (keyIsNumbers) {
if (KPlusInputMethodService.sNumbersState == 2) {
drawableState = mDrawableStatesProvider.KEY_STATE_TOPNAV_CHECKED;
}
}

现在状态定义如下:

KEY_STATE_TOPNAV_NORMAL = new int[] {keyTypeTopNavAttrId};
KEY_STATE_TOPNAV_PRESSED = new int[] {keyTypeTopNavAttrId, android.R.attr.state_pressed};
KEY_STATE_TOPNAV_CHECKED = new int[] {keyTypeTopNavAttrId, android.R.attr.state_selected};

现在我的问题是如何为每个状态提取正确的可绘制对象?我需要获取 drawable 的 9patch 填充,因为如果状态在 9patch 上有不同的填充,它将只为顶部 drawable 获取填充,我想为每个键手动设置填充 (drawable.getPadding(rect)) .

最佳答案

no public API从状态中获取可绘制对象。

StateListDrawable中有一些方法但它们是 @hide 并带有注释 “pending API council”

您可以通过反射调用它们...但风险自负!!!。 (它可能会在未来的版本中改变)

这些方法是:

以下是如何进行(省略异常(exception)):

int[] currentState = view.getDrawableState();
StateListDrawable stateListDrawable = (StateListDrawable)view.getBackground();
Method getStateDrawableIndex = StateListDrawable.class.getMethod("getStateDrawableIndex", int[].class);
Method getStateDrawable = StateListDrawable.class.getMethod("getStateDrawable", int.class);
int index = (int) getStateDrawableIndex.invoke(stateListDrawable,currentState);
Drawable drawable = (Drawable) getStateDrawable.invoke(stateListDrawable,index);

关于android - 从状态列表 drawable 中获取特定的 drawable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26713618/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com