Изображение выходит за пределы 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
больше, но установлены фиксированные значения, но это не проблема, так как в первый раз они уже были рассчитаны по весу, поэтому он должен работать и на разных устройствах.
Опять же, мы должны удалить поля, вы можете извлечь эту часть в некоторые предварительно рассчитанные переменные, чтобы не выполнять этот расчет для всех элементов.
Самый простой способ это исправить. Просто изменить размер картинки. Я так и делал.