假设我有一个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方法。

07-27 14:04