Android中动态调整ImageView的宽高比

原理

我在实践中,是调整一个ListView中的Item里的ImageView元素的宽高比,类似微信公众号的消息内容,item有固定padding,然后ImageView宽度撑满屏幕,高度由一定比例决定。

  • 在写好布局文件后,首先拿到整个屏幕的宽度,然后减去左右两侧的padding所占的宽度,得到的结果就是ImageView应该设置的宽度
  • 再由一定比例计算出高度
  • 最后以ImageView.setLayoutParams()完成宽高的设定

布局文件

<LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp">

    <ImageView
            android:id="@+id/item_notice_iv"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitXY" />

LinearLayout>

代码块

//初始化
ImageView mImageView = (ImageView)       findViewById(R.id.item_notice_center_iv);
mImageView.setAdjustViewBounds(true);

//获取屏幕宽度
WindowManager m = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
m.getDefaultDisplay().getMetrics(outMetrics);

//计算宽高,我需要的图片尺寸是280*136
int width = outMetrics.widthPixels - DensityTool.dp2px(this, 10f) * 2; //乘以2是因为左右两侧的宽度
int height = (int) (width / 280f * 136); //280*136

//设置图片参数
ViewGroup.LayoutParams layoutParams = mImageView.getLayoutParams();
layoutParams.width = width;
layoutParams.height = height;
mImageView.setLayoutParams(layoutParams);

DensityTool

这是我自己造的一个轮子,主要用于像素转换,非常实用的!

public class DensityTool {

    //根据手机的分辨率从 dp 的单位 转成为 px(像素)
    public static float dp2px(Resources resources, float dpValue) {
        final float scale = resources.getDisplayMetrics().density;
        return (dpValue * scale + 0.5f);
    }
    //根据手机的分辨率从 dp 的单位 转成为 px(像素)
    public static int dp2px(Context context, float dpValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int)(dpValue * scale + 0.5f);
    }
    //根据手机的分辨率从 px(像素) 的单位 转成为 dp
    public static float px2dp(Resources resources, float pxValue) {
        final float scale = resources.getDisplayMetrics().density;
        return (pxValue / scale + 0.5f);
    }
    //获取屏幕dpi
    public static int getDpi(Context context) {
        return context.getResources().getDisplayMetrics().densityDpi;
    }
}

其他参考

1、android中使用DisplayMetrics获取屏幕参数
2、ImageView.ScaleType设置图解

你可能感兴趣的:(android,布局,Android,控件)