Android中動態調整ImageView的寬高比
阿新 • • 發佈:2018-12-16
1.原理
我在實踐中,是調整一個ListView中的Item裡的ImageView元素的寬高比,類似微信公眾號的訊息內容,item有固定padding,然後ImageView寬度撐滿螢幕,高度由一定比例決定。
在寫好佈局檔案後,首先拿到整個螢幕的寬度,然後減去左右兩側的padding所佔的寬度,得到的結果就是ImageView應該設定的寬度,再由一定比例計算出高度,最後以ImageView.setLayoutParams()完成寬高的設定。
2.程式碼
//佈局檔案
<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);
3.dp與px轉化
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;
}
}
其他參考