Установить размер рисования программно - PullRequest
80 голосов
/ 06 января 2011

Изображения (значки) имеют примерно одинаковый размер, но мне нужно изменить их размер, чтобы кнопки оставались одинаковой высоты.

Как мне это сделать?

Button button = new Button(this);
button.setText(apiEventObject.getTitle());
button.setOnClickListener(listener);

/*
 * set clickable id of button to actual event id
 */
int id = Integer.parseInt(apiEventObject.getId());
button.setId(id);

button.setLayoutParams(new LayoutParams(
        android.view.ViewGroup.LayoutParams.FILL_PARENT,
        android.view.ViewGroup.LayoutParams.WRAP_CONTENT));

Drawable drawable = LoadImageFromWebOperations(apiSizeObject.getSmall());
//?resize drawable here? drawable.setBounds(50, 50, 50, 50);
button.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);

Ответы [ 11 ]

139 голосов
/ 28 декабря 2011

Метод setBounds() не работает для каждого типа контейнера (однако он работал для некоторых моих ImageView).

Попробуйте метод ниже, чтобы масштабировать сам чертеж:

// Read your drawable from somewhere
Drawable dr = getResources().getDrawable(R.drawable.somedrawable);
Bitmap bitmap = ((BitmapDrawable) dr).getBitmap();
// Scale it to 50 x 50
Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, 50, 50, true));
// Set your new, scaled drawable "d"
32 голосов
/ 17 апреля 2011

Укажите размер с помощью setBounds(), т. Е. Для размера 50x50 используйте

drawable.setBounds(0, 0, 50, 50);

public void setBounds (int слева, int top, int right, int bottom)

14 голосов
/ 20 июня 2013

Перед применением .setBounds (..) попробуйте преобразовать текущий Drawable в ScaleDrawable

drawable = new ScaleDrawable(drawable, 0, width, height).getDrawable();

после этого

drawable.setBounds(0, 0, width, height);

будет работать

8 голосов
/ 23 мая 2017

У меня не было времени разобраться, почему метод setBounds () не работает с растровым изображением, как ожидалось, но у меня есть небольшое улучшенное решение @ androbean-studio, чтобы делать то, что должен делать setBounds ...

/**
 * Created by ceph3us on 23.05.17.
 * file belong to pl.ceph3us.base.android.drawables
 * this class wraps drawable and forwards draw canvas
 * on it wrapped instance by using its defined bounds
 */
public class WrappedDrawable extends Drawable {

    private final Drawable _drawable;
    protected Drawable getDrawable() {
        return _drawable;
    }

    public WrappedDrawable(Drawable drawable) {
        super();
        _drawable = drawable;
    }

    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        //update bounds to get correctly
        super.setBounds(left, top, right, bottom);
        Drawable drawable = getDrawable();
        if (drawable != null) {
            drawable.setBounds(left, top, right, bottom);
        }
    }

    @Override
    public void setAlpha(int alpha) {
        Drawable drawable = getDrawable();
        if (drawable != null) {
            drawable.setAlpha(alpha);
        }
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {
        Drawable drawable = getDrawable();
        if (drawable != null) {
            drawable.setColorFilter(colorFilter);
        }
    }

    @Override
    public int getOpacity() {
        Drawable drawable = getDrawable();
        return drawable != null
                ? drawable.getOpacity()
                : PixelFormat.UNKNOWN;
    }

    @Override
    public void draw(Canvas canvas) {
        Drawable drawable = getDrawable();
        if (drawable != null) {
            drawable.draw(canvas);
        }
    }

    @Override
    public int getIntrinsicWidth() {
        Drawable drawable = getDrawable();
        return drawable != null
                ? drawable.getBounds().width()
                : 0;
    }

    @Override
    public int getIntrinsicHeight() {
        Drawable drawable = getDrawable();
        return drawable != null ?
                drawable.getBounds().height()
                : 0;
    }
}

использование:

// get huge drawable 
final Drawable drawable = resources.getDrawable(R.drawable.g_logo);
// create our wrapper           
WrappedDrawable wrappedDrawable = new WrappedDrawable(drawable);
// set bounds on wrapper 
wrappedDrawable.setBounds(0,0,32,32); 
// use wrapped drawable 
Button.setCompoundDrawablesWithIntrinsicBounds(wrappedDrawable ,null, null, null);

результаты

до: enter image description here после: enter image description here

6 голосов
/ 25 декабря 2016

Для использования

textView.setCompoundDrawablesWithIntrinsicBounds()

Ваша версия minSdk должна быть 17 в build.gradle

    defaultConfig {
    applicationId "com.example..."
    minSdkVersion 17
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
}

Чтобы изменить размер рисунка:

    TextView v = (TextView)findViewById(email);
    Drawable dr = getResources().getDrawable(R.drawable.signup_mail);
    Bitmap bitmap = ((BitmapDrawable) dr).getBitmap();
    Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, 80, 80, true));

    //setCompoundDrawablesWithIntrinsicBounds (image to left, top, right, bottom)
    v.setCompoundDrawablesWithIntrinsicBounds(d,null,null,null);
2 голосов
/ 29 мая 2016

Возможно, немного поздно. Но вот решение, которое, наконец, сработало для меня в любой ситуации.

Идея состоит в том, чтобы создать собственный чертеж с фиксированным внутренним размером и передать задание рисования на исходный чертеж.

Drawable icon = new ColorDrawable(){
        Drawable iconOrig = resolveInfo.loadIcon(packageManager);

        @Override
        public void setBounds(int left, int top, int right, int bottom){
            super.setBounds(left, top, right, bottom);//This is needed so that getBounds on this class would work correctly.
            iconOrig.setBounds(left, top, right, bottom);
        }

        @Override
        public void draw(Canvas canvas){
            iconOrig.draw(canvas);
        }

        @Override
        public int getIntrinsicWidth(){
            return  mPlatform.dp2px(30);
        }

        @Override
        public int getIntrinsicHeight(){
            return  mPlatform.dp2px(30);
        }
    };
2 голосов
/ 01 декабря 2013

Используйте почтовый метод для достижения желаемого эффекта:

{your view}.post(new Runnable()
    {
        @Override
        public void run()
        {
            Drawable image = context.getResources().getDrawable({drawable image resource id});
            image.setBounds(0, 0, {width amount in pixels}, {height amount in pixels});
            {your view}.setCompoundDrawables(image, null, null, null);
        }
    });
0 голосов
/ 17 июня 2019

Прошло много времени с тех пор, как вопрос был задан
, но многим до сих пор неясно, как сделать эту простую вещь.

Это довольно просто в том случае, когда вы используете Drawable в качестве составного Drawable наTextView (кнопка).

Итак, 2 вещи, которые вам нужно сделать:

1.Установить границы:

drawable.setBounds(left, top, right, bottom)

2.Установить подходящее рисование (без использования внутренних границ):

button.setCompoundDrawablesRelative(drawable, null, null, null)
  • Нет необходимости использовать растровые изображения
  • Нет обходных путей, таких как ScaleDrawable ColorDrawable или LayerDrawable (что определенно создано для других целей)
  • Нет необходимости в пользовательских чертежах!
  • Никаких обходных путей с post
  • Это простое и простое решение, как Android ожидает от вас.
0 голосов
/ 25 апреля 2018

Вы можете использовать LayerDrawable только из одного слоя и метода setLayerInset:

Drawable[] layers = new Drawable[1];
layers[0] = application.getResources().getDrawable(R.drawable.you_drawable);

LayerDrawable layerDrawable = new LayerDrawable(layers);
layerDrawable.setLayerInset(0, 10, 10, 10, 10);
0 голосов
/ 11 марта 2012

Вы можете создать подкласс типа представления и переопределить метод onSizeChanged.

Я хотел иметь масштабируемые составные рисованные объекты в моих текстовых представлениях, которые не требовали от меня возиться с определением растровых рисованных объектов вxml и т. д. и сделал это следующим образом:

public class StatIcon extends TextView {

    private Bitmap mIcon;

    public void setIcon(int drawableId) {
    mIcon = BitmapFactory.decodeResource(RIApplication.appResources,
            drawableId);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        if ((w > 0) && (mIcon != null))
            this.setCompoundDrawablesWithIntrinsicBounds(
                null,
                new BitmapDrawable(Bitmap.createScaledBitmap(mIcon, w, w,
                        true)), null, null);

        super.onSizeChanged(w, h, oldw, oldh);
    }

}

(Обратите внимание, что я использовал w дважды, а не h, так как в этом случае я помещал значок над текстом, и, таким образом, значокне должна иметь такую ​​же высоту, как текстовое представление)

Это может быть применено к фоновым объектам или к любому другому параметру, размер которого вы хотите изменить относительно размера вашего представления.onSizeChanged () вызывается при первом создании View, поэтому вам не нужны особые случаи для инициализации размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...