假设我有一个StateListDrawable。我想在其中添加2个可绘制对象:第一个(如果单击),第二个用于其他状态。
我尝试如下(伪代码):
Drawable clickdDrawable = getResourses.getDrawable(R.drawable.presseddrawable);
clickDrawable.setBounds(-100, -100, 100, 100);
Drawable otherStateDrawable = getResources().getDrawable(R.drawable.somedrawable);
otherStateDrawable.setBounds(-50,-50, 50, 50);
StateListDrawable sld = new StateListDrawable();
sld.addState(new int[]{andriod.R.attr.state_pressed, android.R.attr.state_focussed}, clickDrawable);
sld.addState(StateSet.WILDCARD, otherStateDrawable);
sld.setBounds(-50, -50, 50, 50);
现在,如果我处于按下状态,我将获得PressedDrawable,但它会紧贴StateListDrawable的边界。所以我的问题是:如何在StateListDrawable中存储具有不同界限的Drawable?这可能吗?
最佳答案
您将必须创建“自定义” Drawable
,但是在采用这种方式之前,让我邀请您(以及其中涉及的任何人,通常是设计师)重新考虑您的工作,几年前我做了关于程序化绘制的extends Drawable
的繁重工作(尽管还很棒),只是为了简化和实用性而在几个月后将其丢弃,但我不明白为什么用精良的9-补丁(aka n-patch)而不是硬编码尺寸,无论如何,在您致电给我祖父之前,这里是一个可能适用于您的快速答案:
例如,您正在使用彩色可绘制对象:
public class FixedBoundsColorDrawable extends ColorDrawable {
private boolean mFixedBoundsSet = false; // default
public FixedBoundsColorDrawable(int color) {
super(color);
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
if (!mFixedBoundsSet) {
mFixedBoundsSet = true;
super.setBounds(left, top, right, bottom);
}
}
}
按下红色,然后将蓝色用作通配符,然后使用Nexus 4即可获得您的值:
您还可以创建一个包装器来包装任何drawable并调用其方法,但是我会采用这种方式,因为肯定需要一些
final
方法。