Android动态创建ImageView,如何实现全屏幕尺寸统一固定?
解决ImageView在不同屏幕尺寸下显示不一致的问题
嘿,这问题我之前做项目时也踩过坑!你现在用的是硬编码的固定像素值(比如420、210、320),但不同设备的屏幕像素密度(dpi)差异很大,这些固定像素在高分辨率屏幕上会显得偏小,低分辨率屏幕上又会偏大,自然就出现了适配问题。要让ImageView在所有屏幕上保持一致的物理大小,得用**密度无关像素(dp)**来替代固定像素,下面是具体的解决办法:
第一步:写一个dp转像素的工具方法
在你的Activity或者自定义工具类里添加这个方法,它能根据当前屏幕的密度,把dp值转换成对应的实际像素:
private int dpToPx(int dp) { float density = getResources().getDisplayMetrics().density; return Math.round(dp * density); }
第二步:修改代码,用dp转像素后的数值替代硬编码
把原来的固定像素值全部替换成dp转换后的结果——比如你想要ImageView宽420dp、高210dp,偏移量320dp,修改后的代码如下:
for (int i = 0; i < myImageList.size(); i++) { ImageView iv = new ImageView(this); iv.setImageResource(myImageList.get(i)); // 用dp转像素后的宽高设置布局参数 int imgWidth = dpToPx(420); int imgHeight = dpToPx(210); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(imgWidth, imgHeight); lp.gravity = Gravity.CENTER; iv.setLayoutParams(lp); float angleDeg = i * 360.0f / myImageList.size() - 70.0f; float angleRad = (float) (angleDeg * Math.PI / 180.0f); // 偏移量同样用dp转像素后的数值 int offset = dpToPx(320); iv.setTranslationX(offset * (float) Math.cos(angleRad)); iv.setTranslationY(offset * (float) Math.sin(angleRad)); iv.setRotation(angleDeg + 80.0f); main.addView(iv); final int finalI = i; }
为什么这么做?
dp是Android专门为屏幕适配设计的单位,它会自动根据屏幕密度调整对应的像素数:
- 在160dpi(mdpi)屏幕上,1dp = 1px
- 在240dpi(hdpi)屏幕上,1dp = 1.5px
- 在320dpi(xhdpi)屏幕上,1dp = 2px
这样不管用户用的是手机还是平板,你的ImageView都会保持一致的物理大小,完美解决跨屏幕的适配问题!
内容的提问来源于stack exchange,提问作者Amirhossein Maleki
相关产品推荐
相关产品推荐

