dro*_*ter 115 android drawable imageview
我有一个ImageView,它有一个可绘制的图像资源设置到选择器.如何以编程方式访问选择器并更改突出显示和非突出显示状态的图像?
这是选择器的代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/iconSelector">
<!-- pressed -->
<item android:state_pressed="true" android:drawable="@drawable/btn_icon_hl" />
<!-- focused -->
<item android:state_focused="true" android:drawable="@drawable/btn_icon_hl" />
<!-- default -->
<item android:drawable="@drawable/btn_icon" />
</selector>
Run Code Online (Sandbox Code Playgroud)
我希望能够替换btn_icon_hl和btn_icon其他图像.
kco*_*ock 244
至于我已经能够找到(我自己尝试过类似的东西),在定义StateListDrawable之后无法修改单个状态.但是,您可以通过代码定义一个新的:
StateListDrawable states = new StateListDrawable();
states.addState(new int[] {android.R.attr.state_pressed},
getResources().getDrawable(R.drawable.pressed));
states.addState(new int[] {android.R.attr.state_focused},
getResources().getDrawable(R.drawable.focused));
states.addState(new int[] { },
getResources().getDrawable(R.drawable.normal));
imageView.setImageDrawable(states);
Run Code Online (Sandbox Code Playgroud)
你可以随便保留其中两个,或者根据需要创建另一个.
我有同样的问题,并进一步解决它.但唯一的问题是你不能在xml中指定NavStateListDrawable,所以你必须通过代码设置UI元素的背景.然后必须覆盖onStateChange方法以确保每次更改主drawable的级别时,还要更新子级别列表的级别.
构造NavStateListDrawable时,您必须传入要显示的图标的级别.
public class NavStateListDrawable extends StateListDrawable {
private int level;
public NavStateListDrawable(Context context, int level) {
this.level = level;
//int stateChecked = android.R.attr.state_checked;
int stateFocused = android.R.attr.state_focused;
int statePressed = android.R.attr.state_pressed;
int stateSelected = android.R.attr.state_selected;
addState(new int[]{ stateSelected }, context.getResources().getDrawable(R.drawable.nav_btn_pressed));
addState(new int[]{ statePressed }, context.getResources().getDrawable(R.drawable.nav_btn_selected));
addState(new int[]{ stateFocused }, context.getResources().getDrawable(R.drawable.nav_btn_focused));
addState(new int[]{-stateFocused, -statePressed, -stateSelected}, context.getResources().getDrawable(R.drawable.nav_btn_default));
}
@Override
protected boolean onStateChange(int[] stateSet) {
boolean nowstate = super.onStateChange(stateSet);
try{
LayerDrawable defaultDrawable = (LayerDrawable)this.getCurrent();
LevelListDrawable bar2 = (LevelListDrawable)defaultDrawable.findDrawableByLayerId(R.id.nav_icons);
bar2.setLevel(level);
}catch(Exception exception)
{
}
return nowstate;
}
}
Run Code Online (Sandbox Code Playgroud)
对于所有不同的导航按钮可绘制状态,我有类似以下内容.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/top_bar_default" >
</item>
<item android:id="@+id/nav_icons" android:bottom="0dip">
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="0" >
<bitmap
android:src="@drawable/top_bar_icon_back"
android:gravity="center" />
</item>
<item android:maxLevel="1" >
<bitmap
android:src="@drawable/top_bar_icon_nav"
android:gravity="center" />
</item>
<item android:maxLevel="2" >
<bitmap
android:src="@drawable/top_bar_icon_settings"
android:gravity="center" />
</item>
<item android:maxLevel="3" >
<bitmap
android:src="@drawable/top_bar_icon_search"
android:gravity="center" />
</item>
</level-list>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
我打算将这个问题作为一个问题和答案发布,但是当你问到这个问题的时候,你就去了.请注意,这可以为您节省大量的xml文件定义.我从约50-100 xml的定义下降到约4!
| 归档时间: |
|
| 查看次数: |
64967 次 |
| 最近记录: |