Сравните ширину, высоту экрана и загрузите динамические изображения без потери соотношения сторон, чтобы соответствовать всем устройствам экрана

#android

#Android

Вопрос:

Я пытался добиться ширины и высоты загрузки изображений в Facebook на основе ширины и высоты всего размера экрана на домашней странице.

Ниже я опубликовал код, который я пробовал до сих пор.

Я пробовал это двумя способами:

Первый способ:

home_activity_layout.xml:

 <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="5dp"
     >

     <LinearLayout
        android:id="@ id/rl_vertical_list"
        android:visibility="visible"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

       <RelativeLayout
            android:id="@ id/post_items_layout_middle_home"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_marginTop="10dp" >

           <com.steve.thirdparty.ScalableImageView
                    android:id="@ id/iv_posted_img_home"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:adjustViewBounds="true"
                    android:layout_centerHorizontal="true"
                    android:src="@drawable/golive_load_image"
                    android:layout_below="@ id/tv_user_posted_msg_post_items_home"
                    android:contentDescription="@string/cont_desc"/>

    </RelativeLayout>
    </LinearLayout>
    </RelativeLayout>
  

ScalableImageView.java:

 public class ScalableImageView extends ImageView {

    public ScalableImageView(Context context) {
        super(context);
    }

    public ScalableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScalableImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Drawable d = getDrawable();
        if (d != null) {
            int w = MeasureSpec.getSize(widthMeasureSpec);
            int h = w * d.getIntrinsicHeight() / d.getIntrinsicWidth();

            Log.e("Width", "" w);
            Log.e("Height", "" h);

            setMeasuredDimension(w, h);
        }
        else super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
  

Но я не получил ожидаемого результата для разных измерений image.it не будет превышать высоту для изображений с более высокой плотностью пикселей.

Второй способ:

Получите ширину и высоту экрана и выполните некоторые вычисления:

  DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        float screenHeight= displayMetrics.heightPixels / displayMetrics.density;
        float screenWidth = displayMetrics.widthPixels / displayMetrics.density;


if(ImageHeight > ImageWidth)  
{ 
float scale = ImageWidth/ImageHeight
float screenWidth = 320 (for example)
float getHeight = screenWidth /scale  


}
  

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

Любой может мне помочь с этим.Спасибо.

Ответ №1:

Я решил эту проблему двумя способами :

Первый способ:

Я внес некоторые изменения в ImageView.Я удалил внешний класс для imageview.Использование imageview width и height перенос содержимого сделали вид изображения подходящим для всех устройств экрана adjustviewbounds .

  <ImageView
     android:id="@ id/iv_posted_img_home"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:adjustViewBounds="true"
     android:scaleType="fitStart"
     android:src="@drawable/load_image"
     android:layout_below="@ id/tv_user_posted_msg_post_items_home"
     android:contentDescription="@string/cont_desc"/>
  

Примечание: Использование width и height wrapcontent приведет к ошибке памяти.

Второй способ:

Это решение является самым безопасным решением, чтобы не превышать ошибку нехватки памяти.

В ответе json я получаю ширину и высоту изображения.Итак, я обрабатываю все изображения в адаптере, используя ширину и высоту.

Код адаптера:

     if(rowItem.getWidthImage() != null){

                   if(rowItem.getWidthImage().equals(null) || rowItem.getWidthImage().equals("")){

                       Log.e("InvalidImage", "Test");

                   }else {

                       Log.e("imageWidth", "" rowItem.getWidthImage());
                       Log.e("imageHeight", "" rowItem.getHeightImage());

                       int imageWidth = Integer.parseInt(rowItem.getWidthImage());
                       int imageHeight = Integer.parseInt(rowItem.getHeightImage());


                       DisplayMetrics dm = new DisplayMetrics();
                       ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);

                       int width = dm.widthPixels;
                       int height = width * imageHeight / imageWidth; 

                       params = new LinearLayout.LayoutParams(width, height);

                       holder.ivPostedImageNew.setLayoutParams(params);
                       holder.llPostedImage.addView(holder.ivPostedImageNew);


                       Glide.with(context).load(rowItem.getPosteduserpostimage()).placeholder(R.drawable.golive_load_image).error(R.drawable.bg_golive).into(holder.ivPostedImageNew);


                   }


               }
  

Для получения более подробной информации: смотрите здесь