Android Layer_Drawable как кнопка - PullRequest
       16

Android Layer_Drawable как кнопка

2 голосов
/ 27 октября 2010

У меня есть кнопка.Кнопка построена из 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-образ действительно выровнен по правому краю, но имеет различие с правой стороны кнопки.Вот снимок: alt text

Я хочу, чтобы изображение было выровнено по левому краю кнопки, единственный способ прямо сейчас, я думаю, что я могу сделать это:

  1. наследовать кнопку,в onLayout ПОСЛЕ того, как ширина была установлена, получите правый край.
  2. получите фон для рисования (layerDrawable)
  3. вычислите ширину кнопки минус ширину изображения v и установите его в качестве левого поля в рисованной области.

Не стоит упоминать, что это звучит ужасно :-) Я надеялся, что есть лучший способ.О, причина того, что это не часть изображения, заключается в том, что мне нужно знать его ширину, чтобы я мог рассчитать отступы текста, чтобы он не скрывался текстом кнопки и потому что он не так хорошо выглядит, как 9-патч.

1 Ответ

0 голосов
/ 23 ноября 2010

Похоже, что не было правильного решения этого. Слой для статичных, а не 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);
    }
}

Если я не разбиваю исходный холст, то есть "толкаю" любые поля, которые я добавляю, это также можно исправить, я думаю, используя свойство xml, которое указывает, должны ли дочерние элементы быть обрезанными на макете, содержащем эту кнопку, но я найдите это слабое решение, так как оно делает мою кнопку зависимой от наших условий. Само изображение, которое я получаю из XML, используя новые атрибуты, стиль и тему, которые я объявляю.

Надеюсь, это поможет некоторым людям там.

...