Android Layer_ボタンとして描画可能
質問
ボタンがあります。ボタンは、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 の画像は確かに右に配置されていますが、ボタンの右側とは異なります。これがスナップショットです:
画像をボタンの左側に揃えたいのですが、今のところそれができると思う唯一の方法は次のとおりです。
- 継承ボタン、幅が設定された後の onLayout で右端を取得します。
- 背景のドローアブルを取得します (layerDrawable)
- ボタンの幅から v イメージの幅を引いた値を計算し、それをドローアブルの左マージンとして設定します。
これは恐ろしく聞こえるので言及しないでください:-) もっと良い方法があることを願っています。ああ、それが画像の一部ではない理由は、ボタンのテキストで隠れないようにテキストのパディングを計算するために幅を知る必要があることと、9パッチとして見栄えがあまり良くないためです。
解決
ようです。層は明らかに、静的ではなく9-パッチ画像のためである、またはそれはそうです。 私は、ボタンを拡張し、それがドローに変更ですので、私はダウン私のエッジを押し余白から抜け出すと、右上隅に私の画像を配置する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から取得します。
希望、それはそこにいくつかの皆さんをお手伝いします。