StateListDrawable包含具有不同边界的Drawable

时间:2013-06-14 13:38:14

标签: java android drawable state

假设我有一个StateListDrawable。我想在其中添加2个drawable:第一个如果被点击,第二个用于任何其他状态。

我尝试了如下(伪代码):

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);

现在,如果我处于状态按下,我将得到可按抽屉,但它坚持StateListDrawable的界限。所以我的问题是:如何在StateListDrawable中存储具有不同边界的Drawables?这可能吗?

1 个答案:

答案 0 :(得分:1)

你必须创建“自定义”Drawable,但在你这样做之前,让我邀请你(以及任何参与的人,通常是设计师)重新思考你正在做的事情,几年前,我做了一个繁重的工作,以编程方式绘制extends Drawable s(但它真棒)只是为了废弃它几个月后支持简单性和实用性,我不明白为什么你不能实现像这是一个精心制作的9补丁(又名n补丁)而不是硬编码尺寸,无论如何,在你打电话给我爷爷之前,这是一个快速的答案可能适用于你:

例如,你说你正在使用彩色绘图:

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:

http://i.imgur.com/854Hl0K.png

你也可以创建一个包装器来包装任何drawable并调用它的方法,但我会这样做,因为你肯定需要一些final方法。