2016-10-22 2 views
1

У меня есть ImageView с фиксированной высотой и шириной (скажем, с шириной 100dp и высотой 50dp). Мне нужно динамически загружать изображение в это изображение.как подобрать изображение к ширине и сохранить соотношение сторон в андроиде

Я хочу, чтобы это изображение масштабировалось таким образом, чтобы оно заполняло ширину изображения, но сохраняло соотношение сторон (меня не волнует, если часть изображения не видна из-за ограничения высоты).

то, что я хочу, очень похоже на centerCrop, но я не хочу, чтобы мое изображение было центрировано по вертикали!

благодарит заранее.

edit1:

вот мой код:

это мой макет. Я хочу установить изображение для 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 коде вы создаете объект Bitmap с нужной ширины (ваша ширина ImageView) и установите его на изображение. но вам нужно сделать свой ImageView scaleType в матрицу, чтобы предотвратить андроид от автоматического масштабирования!

+0

Можно ли сделать это точно, не преобразовывая извлечение в растровое изображение? это очень медленно для моего использования. –

+2

Вы хоть представляете, как долго я искал именно это! +1 – instanceof

0

Давайте предположим, что вы получили 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); 
+0

спасибо за ваш ответ. Он работал с небольшим изменением моего собственного :) –

0

Я думаю, что вы можете просто установить высоту ImageView, чтобы, например, 50dp, и попытайтесь изменить scaleType на один из описанных в этой ссылке: https://developer.android.com/reference/android/widget/ImageView.ScaleType.html. Я не помню, что делает.

+0

он не работает! Я боролся с этим уже несколько дней. ближайший scaleType, с которым я столкнулся, был centerCrop, но я не хочу, чтобы функция центра !!! –

0

Для создания изображения с шириной равно ширине экрана и высоте, пропорционально установленной в соответствии с соотношением сторон, выполните следующие действия. Здесь я упоминаю, как загрузить изображение в 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); 
        } 
       }); 

Надеюсь, это поможет. :)