#android #android-layout #imageview #android-imageview
#Android #android-layout #просмотр изображений #android-imageview
Вопрос:
У меня есть ImageView с фиксированной высотой и шириной (скажем, с шириной 100dp и высотой 50dp). Мне нужно динамически загружать изображение в этот вид изображения.
Я хочу, чтобы это изображение масштабировалось таким образом, чтобы оно заполняло ширину ImageView, но сохраняло соотношение сторон (меня не волнует, если часть изображения не видна из-за ограничения высоты).
то, что я хочу, действительно похоже на centerCrop
, но я не хочу, чтобы мое изображение было центрировано по вертикали!
заранее спасибо.
правка1:
вот мои коды:
это мой макет. Я хочу установить изображение для ImageView с background
идентификатором.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@ id/background"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignTop="@ id/footer"
android:layout_alignBottom="@id/footer"
/>
<RelativeLayout
android:id="@ id/footer"
android:layout_width="match_parent"
android:layout_height="100dp">
</RelativeLayout>
обратите внимание, что ImageView привязан к размеру второго RelativeLayout:
android:layout_alignTop="@ id/footer"
android:layout_alignBottom="@id/footer"
Ответ №1:
сначала в вашем макете добавьте
android:scaleType="matrix"
к вашему ImageView.
затем в вашем Java-коде добавьте это:
ackground.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Bitmap backgroundBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.background_image);
float imageRatio = (float) backgroundBitmap.getWidth() / (float) backgroundBitmap.getHeight();
int imageViewWidth = background.getWidth();
int imageRealHeight = (int) (imageViewWidth / imageRatio);
Bitmap imageToShow = Bitmap.createScaledBitmap(backgroundBitmap, imageViewWidth, imageRealHeight, true);
background.setImageBitmap(imageToShow);
}
});
Я разберу это для вас:
в Java-коде вы создаете растровый объект с желаемой шириной (вашей шириной ImageView) и устанавливаете его в вашем ImageView. но вам нужно преобразовать ваш ImageView scaleType в matrix, чтобы Android не мог автоматически масштабировать его!
Комментарии:
1. возможно ли сделать именно это, не преобразуя рисованное изображение в растровое? для моего использования это действительно медленно.
2. Вы хоть представляете, как долго я искал именно это! 1
Ответ №2:
Давайте предположим, что у вас есть Bitmap
изображение, а именно ImageBitmap, и ImageView
, а именно myImageView. Вот как изменить его размер, чтобы оно заполняло всю ширину вашего imageview с сохранением соотношения сторон:
float imageOriginalWidthHeightRatio = (float) imageBitmap.getWidth() / (float) imageBitmap.getHeight();
int imageToShowWidth = myImageView.getWidth()
int imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio);
Bitmap imageToShow = Bitmap.createScaledBitmap(imageBitmap, imageToShowWidth, imageToShowHeight, true);
myImageView.setImageBitmap(imageToShow);
Комментарии:
1. спасибо за ваш ответ. Это сработало с моей собственной небольшой настройкой 🙂
Ответ №3:
Я думаю, вы можете просто установить высоту ImageView, например, на 50dp, и попытаться изменить scaleType на один из описанных в этой ссылке:https://developer.android.com/reference/android/widget/ImageView.ScaleType.html. Я не помню, что именно делает.
Комментарии:
1. это не работает! Я боролся с этим уже несколько дней. самым близким типом масштаба, с которым я столкнулся, был centerCrop, но мне не нужна функция централизации!!!
Ответ №4:
Чтобы создать изображение, ширина которого равна ширине экрана, а высота пропорционально задана в соответствии с соотношением сторон, выполните следующие действия. Здесь я упоминаю, как загрузить изображение в imageview с URL.
Glide.with(context).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
// creating the image that maintain aspect ratio with width of image is set to screenwidth.
int width = imageView.getMeasuredWidth();
int diw = resource.getWidth();
if (diw > 0) {
int height = 0;
height = width * resource.getHeight() / diw;
resource = Bitmap.createScaledBitmap(resource, width, height, false);
}
imageView.setImageBitmap(resource);
}
});
Надеюсь, это поможет. 🙂