1

StateListDrawable があるとします。その中に2つのドローアブルを追加したいと思います.1つ目はクリックされた場合、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 内に異なる境界を持つ Drawables を格納する方法は? これは可能ですか?

4

1 に答える 1

1

「カスタム」を作成する必要がありますがDrawable、その前に、あなた(および関係者、多くの場合デザイナー)が何をしているのかを少し再考するよう招待させてください。数年前、私は大変な仕事をしましたプログラムで描画された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 で取得した値を使用すると、次のようになります。

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

finalドローアブルをラップしてそのメソッドを呼び出すラッパーを作成することもできますが、確かに必要なメソッドがいくつかあるため、そのようにします。

于 2013-07-12T02:39:21.033 に答える