是否经常会遇到这种情况:我怕们需要一个ImageView,一般情况下既想让它宽度适应屏幕,又想让它高度适应图片。但是图片比例和屏幕比例没有关联,我们给ImageView设置尺寸,要不就是充满屏幕,要不就是包裹内容,固定尺寸无法应对图片比例不确定的情况。所以我们需要写一个工具方法,来调整控件尺寸,达到既适应图片,又适应屏幕的目的。
看代码:工具类
public class ImageViewUtil {
public static void matchAll(Context context, ImageView imageView) {
int width, height;//ImageView调整后的宽高
//获取屏幕宽高
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
int sWidth = metrics.widthPixels;
int sHeight = metrics.heightPixels;
//获取图片宽高
Drawable drawable = imageView.getDrawable();
int dWidth = drawable.getIntrinsicWidth();
int dHeight = drawable.getIntrinsicHeight();
//屏幕宽高比,一定要先把其中一个转为float
float sScale = (float) sWidth / sHeight;
//图片宽高比
float dScale = (float) dWidth / dHeight;
/*
缩放比
如果sScale>dScale,表示在高相等的情况下,控屏幕比较宽,这时候要适应高度,缩放比就是两则的高之比,图片宽度用缩放比计算
如果sScale<dScale,表示在高相等的情况下,图片比较宽,这时候要适应宽度,缩放比就是两则的宽之比,图片高度用缩放比计算
*/
float scale = 1.0f;
if (sScale > dScale) {
scale = (float) dHeight / sHeight;
height = sHeight;//图片高度就是屏幕高度
width = (int) (dWidth * scale);//按照缩放比算出图片缩放后的宽度
} else if (sScale < dScale) {
scale = (float) dWidth / sWidth;
width = sWidth;
height = (int) (dHeight / scale);//这里用除
} else {
//最后两者刚好比例相同,其实可以不用写,刚好充满
width = sWidth;
height = sHeight;
}
//重设ImageView宽高
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height);
imageView.setLayoutParams(params);
//这样就获得了一个既适应屏幕有适应内部图片的ImageView,不用再纠结该给ImageView设定什么尺寸合适了
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:background="#b26868"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:layout_centerInParent="true"
android:src="@drawable/xiongmao" />
</RelativeLayout>
主程序调用:
public class MainActivity extends AppCompatActivity {
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mImageView = (ImageView) findViewById(R.id.img_container);
//mImageView.setImageResource(R.drawable.fengjing_1);
ImageViewUtil.matchAll(this, mImageView);
}
}
运行情况:
布局效果
使用工具调整之后
动态改变图片之后