1

假设我有一个 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?这可能吗?

4

1 回答 1

1

您将不得不创建“​​自定义” Drawable,但在您这样做之前,让我邀请您(以及涉及的任何人,通常是设计师)重新思考一下您在做什么,几年前我做了一项繁重的工作在以编程方式绘制extends Drawable的 s 上(但它很棒)只是为了在几个月后将其丢弃以支持简单性和实用性,我不明白为什么你不能用制作精良的 9-patch(又名 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 上获得的值:

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

final您还可以创建一个包装器来包装任何可绘制对象并调用其方法,但我会这样做,因为您肯定需要一些方法。

于 2013-07-12T02:39:21.033 回答