比较屏幕宽度,高度和加载动态图像,而不会失去纵横比以适合所有屏幕设备

时间:2016-10-12 06:27:35

标签: 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);
    }
}

但是我没有获得不同维度图像的预期结果。它不会超过更高密度像素图像的高度。

第二种方式:

获取屏幕宽度和高度并进行一些计算:

 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 个答案:

答案 0 :(得分:1)

我用两种方式解决了这个问题:

第一种方式:

我已经使用ImageView进行了一些更改。我删除了imageview的外部类。使用imageview widthheight使用adjustviewbounds将内容制作的图像视图包装到所有屏幕设备。< / p>

 <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响应中,我得到了imageview的宽度和高度。所以我使用宽度和高度处理适配器中的所有imageview。

适配器代码:

    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);


                   }


               }

有关详情:请参阅here