StateListDrawable包含具有不同边界的Drawable

问题描述 投票:1回答:1

假设我有一个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);

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

java android drawable state
1个回答
1
投票

你将不得不创建“​​自定义”Drawables,但在你这样做之前,让我邀请你(以及任何参与的人,通常是设计师)重新思考你正在做的事情,几年前我做了大量工作以编程方式绘制的extends Drawables(但它真棒)只是为了在几个月之后废弃它以支持简单性和实用性,我不明白为什么你不能用一个制作精良的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上获得值:

您还可以创建一个包装器来包装任何drawable并调用它的方法,但我会这样,因为有一些final方法,你当然需要。

© www.soinside.com 2019 - 2024. All rights reserved.