Autoresize ImageButton с фоном LayerDrawable

У меня есть ImageButton, который должен содержать текст. Для этого я использую LayerDrawable (метод createImage в классе CustomViewFactory). Короче говоря

 public class CustomViewFactory extends ImageButton {
    public CustomViewFactory createButton(String text) {
    this.setBackgroundDrawable(createImage(R.drawable.back_configuration, text));
    return this;
    }

back_configuration.xml

  <?xml version="1.0" encoding="utf-8"?>
     <selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/back_button_pressed" adroid:state_pressed="true">     </item>
    <item android:drawable="@drawable/back_button_normal"></item>
    <item android:drawable="@drawable/back_button_pressed" android:state_focused="true"/>

    </selector>

back_button_normal и back_button_pressed — 9 патчей png файлов.

public LayerDrawable createImage(int resource, String text){
        Drawable [] layers = new Drawable[2];
        layers[0] = new TextDrawable(text);
        layers[1] = r.getDrawable(R.drawable.back_configuration);
        return new LayerDrawable(resource);
    }

public class TextDrawable extends Drawable {

    private final String text;
    private final Paint paint;
    public TextDrawable(String text) {

        this.text = text;
       this.paint = new Paint();
        paint.setColor(Color.WHITE);
        paint.setFilterBitmap(true); 
        paint.setTextSize(textSize);
        paint.setAntiAlias(true);
        paint.setFakeBoldText(true);
        paint.setStyle(Paint.Style.FILL);
        paint.setTextAlign(Paint.Align.LEFT);

    }

    @Override
    public void draw(Canvas canvas) {
        canvas.drawText(text, 0, 0, paint);
    }

    @Override
    public void setAlpha(int alpha) {
        paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        paint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

Проблема. Если текст большой, то он обрезается. Как сделать так, чтобы сам ImageButton увеличивался в размерах в зависимости от текста внутри. Какие есть альтернативные методы.

И если я использую кнопку, изображение растягивается на кнопке

Прошу прощения за мой английский. Большое спасибо.


person Yuriy Aizenberg    schedule 15.08.2012    source источник


Ответы (1)


Вы можете попробовать использовать textView, а не imageView или imageButton, а затем назначить фон для текстового представления как изображение, которое вы хотите, и установить текст, который вы хотите для textView, и сделать его wrap_content для layout_width

Редактировать: проверьте, используете ли вы отступы для текстового представления, удалите их.

person Amt87    schedule 15.08.2012
comment
Благодарю вас! Это действительно работа. Была одна проблема. Текст не посередине. imageshack.us/photo/my-images/855/26032627.png - person Yuriy Aizenberg; 15.08.2012
comment
Вы можете установить атрибут гравитации для textView в центр - person Amt87; 15.08.2012
comment
android:gravity=center ... если ответ вам подходит, вы можете отметить его слева - person Amt87; 15.08.2012
comment
setGravity(center) для textView не работает. Это то, что я пытаюсь - person Yuriy Aizenberg; 15.08.2012
comment
Вовсе нет... так что теперь каков статус? это все еще как изображение в ссылке? - person Amt87; 15.08.2012
comment
Да (если я использую метод setText, текст и изображение не совпадают... они используют разные центры. - person Yuriy Aizenberg; 15.08.2012
comment
wrap_content для ширины и высоты - person Amt87; 15.08.2012
comment
Никаких эффектов. Я хочу получить компонент (представление) с: масштабированием, изображением, текстом. Кнопка растяжения изображения. ImageButton не имеет метода setText. TextView очень хорошо растягивает изображение в зависимости от текста, но текст и изображение не совпадают... идеи? - person Yuriy Aizenberg; 15.08.2012
comment
Amt87, спасибо большое. Это была моя ошибка. Я неправильно использую 9 патч, забываю установить пути к содержимому. - person Yuriy Aizenberg; 15.08.2012