2

ボタンがあります。ボタンは、StateListDrawable(3つの9パッチイメージで構成されています)から構成されています。ボタンの右側に配置されるドローアブルを追加する必要があり、ボタンの右側に揃える必要があります。私は以下を使おうとしました:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/blue_back_button_drawable" />
    <item>
      <bitmap android:src="@drawable/filter_by_button_v_mark" android:gravity="right"/>
    </item>
</layer-list>

それは機能せず、V画像は確かに右に揃えられていますが、ボタンの右側との違いがあります。スナップショットは次のとおりです。代替テキスト

画像をボタンの左に揃えたいのですが、今できる唯一の方法は次のとおりです。

  1. 継承ボタン、onLayoutで、幅が設定された後、右端を取得します。
  2. 背景を描画可能にする(layerDrawable)
  3. ボタンの幅からv画像の幅を引いたものを計算し、ドローアブルの左マージンとして設定します。

これは恐ろしいことだと言うべきではありません:-)もっと良い方法があるといいのですが。ああ、それが画像の一部ではない理由は、ボタンのテキストによって隠されないようにテキストのパディングを計算できるように、また9パッチのように見栄えが良くないため、幅を知る必要があるためです。

4

1 に答える 1

0

これに対する適切な解決策がなかったようです。レイヤーは静的なものであり、9パッチの画像ではないようです。そこで、Buttonを拡張し、Draw上に変更しました。Canvas.restore()を使用して、エッジを押し下げた余白を抜け出し、画像を右上隅に配置する必要があります...コードは次のとおりです。

 @Override
public void setPadding(int left, int top, int right, int bottom) {
    right += mImageWidth;
    super.setPadding(left, top, right, bottom);
}

private void setVImageDrawable(Drawable d) {
    mVImageDrawable = d;
    mImageWidth = mVImageDrawable.getIntrinsicWidth();
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if( mVImageDrawable != null && mIsMarked){
        //for some reason the clip binds us to position with margins, which is not so good for us.
        //we need to save the clip, restore the canvas to pre clipping mode, do what we need then
        //put the canvas back to it's previous clipping state.
        Rect bounds = canvas.getClipBounds();
        canvas.restore();
        int right = getRight();
        int left = right - mImageWidth;
        int top = getTop();
        int bottom = top + mVImageDrawable.getIntrinsicHeight();
        mVImageDrawable.setBounds(left, top, right, bottom);
        mVImageDrawable.draw(canvas);
        canvas.save();
        canvas.clipRect(bounds);
    }
}

追加したマージンで元のキャンバスigetを分割しない場合は、修正される可能性があります。このボタンを含むレイアウトで子をクリップするかどうかを指定するxmlプロパティを使用すると思いますが、そのラメが見つかります。それは私のボタンを私たちの条件に依存させるので解決策。宣言した新しい属性とスタイルおよびテーマを使用してXMLから取得した画像自体。

それがそこにいくつかのpplを助けることを願っています。

于 2010-11-23T15:38:44.983 に答える