今天做项目遇到了一个问题,一开始把RecycerView中每一Item的ImageView的高度写了一个固定的dp值,一个屏幕中出现四个,换了手机测试之后,一个屏幕出现了4个半,有的是5个,后来想下通过获取屏幕宽度的方式来适配吧。
看一下这位老兄https://www.cnblogs.com/H-BolinBlog/p/6878469.html
他写的这个方法:
public void getAndroiodScreenProperty() {
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; // 屏幕宽度(像素)
int height = dm.heightPixels; // 屏幕高度(像素)
float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = dm.densityDpi; // 屏幕密度dpi(120 / 160 / 240)
// 屏幕宽度算法:屏幕宽度(像素)/屏幕密度
int screenWidth = (int) (width / density); // 屏幕宽度(dp)
int screenHeight = (int) (height / density);// 屏幕高度(dp)
Log.d("h_bl", "屏幕宽度(像素):" + width);
Log.d("h_bl", "屏幕高度(像素):" + height);
Log.d("h_bl", "屏幕密度(0.75 / 1.0 / 1.5):" + density);
Log.d("h_bl", "屏幕密度dpi(120 / 160 / 240):" + densityDpi);
Log.d("h_bl", "屏幕宽度(dp):" + screenWidth);
Log.d("h_bl", "屏幕高度(dp):" + screenHeight);
}
那我们重新梳理一下,px和dp之间的关系:dp * 密度 = px
于是乎我有了获取ImageView宽度的方法:
public int getImageWidth() {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; // 屏幕宽度(像素)
float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)
//130是在xml文件中那一排recyclerview之间的间距加上recyclerview和父控件的间距的和
int imageWidth = (int)(width -130*density) / 4;
return imageWidth;
}
那么再设置ImageView的长宽,需求的ImageView是一个正方形,所以:
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.img.getLayoutParams();
params.height = getImageWidth();
params.width = getImageWidth();
然后使用Glide把服务器的图片放进去
遇到一个坑:
如果写成这样:
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(getImageWidth(), getImageWidth());
holder.img.setLayoutParams(params);
那么xml布局文件中的margin属性将全部失效,其实很好理解,new了一个新的出来,之前的属性都不管用了,
一个是get,一个是set,但是意义很不同,自行体会吧。
总结
更加深刻理解了dp 和 px 的区别和含义,以及开发中遇到的一些小坑,记录下来,方便查阅。