Изображение выходит за пределы ImageButton

введите описание изображения здесь

И ImageButtons, и Image были добавлены программно:

//some code...
int pixelsToDp = convertToPixelsDp(-4.5f);
params.setMargins(pixelsToDp, pixelsToDp, pixelsToDp, pixelsToDp);
//some code...
ImageButton btn = new ImageButton(this);
                    btn.setPadding(0, 0, 0, 0);
                    btn.setLayoutParams(params);
                    btn.setScaleType(ImageView.ScaleType.CENTER_CROP);
                    buttonRow.add(btn);

Изображение было добавлено функцией setBackgroundResource(). Как сделать изображение полностью внутри ImageButton? Спасибо!

2 ответа

Добавьте этот класс в новый файл, но для теста может быть тот же файл

class MyImageButton extends ImageButton
{
    MyImageButton(Context context){
        super(context);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh){
        Log.v("measure", "width:" + w + " height:" + h);
        if(w != h) {

            TableRow.LayoutParams params = new TableRow.LayoutParams(
                    w, w
            );
            int pixelsToDp = convertToPixelsDp(-4.5f);
            params.setMargins(pixelsToDp, pixelsToDp, pixelsToDp, pixelsToDp);
            this.setLayoutParams(params);
        }
    }
}

Теперь используйте ваш недавно созданный класс вместо оригинального ImageButton

ImageButton btn = new MyImageButton(this);

Также измените это, если вы хотите, чтобы ваше изображение масштабировалось

btn.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

(Я проверял с btn.setImageResource(R.drawable.ic_launcher);)

Некоторое объяснение на случай, если это работает:)

В нашем ImageButton расширяющий класс мы переопределяем onSizeChanged и там мы устанавливаем новые параметры макета, они не рассчитываются weight больше, но установлены фиксированные значения, но это не проблема, так как в первый раз они уже были рассчитаны по весу, поэтому он должен работать и на разных устройствах.

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

Самый простой способ это исправить. Просто изменить размер картинки. Я так и делал.

Другие вопросы по тегам