今天做项目遇到了一个问题,一开始把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,但是意义很不同,自行体会吧。
<ImageView android:id="@+id/img_credit_org" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="8dp" android:layout_marginLeft="13dp" android:layout_marginRight="13dp"/>
总结
更加深刻理解了dp 和 px 的区别和含义,以及开发中遇到的一些小坑,记录下来,方便查阅。