Android屏幕适配问题,ImageView在代码中设置宽高,以及使用LayoutParams的坑

今天做项目遇到了一个问题,一开始把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 的区别和含义,以及开发中遇到的一些小坑,记录下来,方便查阅。

 

 

你可能感兴趣的:(Android开发遇到的坑)