在 Android 上正确处理多种屏幕尺寸的问题已经被讨论了数千次。但是我找不到解决 m 问题的方法。简而言之,我需要将自定义进度条与 imageView 对齐。我有 3 组用于 imageView 的可绘制对象 - ldpi(240x400)、mdpi(320x480)、hdpi(480x800)。我将我在 Java 中的自定义视图与以下代码对齐:
//get screen density
float density = getBaseContext().getResources().getDisplayMetrics().density;
//set the progress bar position according to screen density
if ( density == 1.0f)
{
ImageView micImage = ((ImageView) findViewById(R.id.imageViewClk));
Drawable drawing = micImage.getDrawable();
Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
// Get current dimensions
int width = bitmap.getWidth();
int height = bitmap.getHeight();
LayoutParams params = new LayoutParams((int)(height/13.94), (int)(height/13.94));
params.setMargins((int)(width/2.30), 0, 0, (int)(height/2.75));
params.addRule(RelativeLayout.ALIGN_LEFT,R.id.imageViewClk);
params.addRule(RelativeLayout.ALIGN_BOTTOM,R.id.imageViewClk);
myCustomTwistedProgressBar.setLayoutParams(params);
}else if ( density == 1.5f ){
ImageView micImage = ((ImageView) findViewById(R.id.imageViewClk));
Drawable drawing = micImage.getDrawable();
Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
int width = bitmap.getWidth();
int height = bitmap.getHeight();
LayoutParams params = new LayoutParams((int)Math.round(height/14.13), (int)Math.round(height/14.13));
params.setMargins((int)Math.round( width/2.27), 0, 0, (int)Math.round(height/2.91));
params.addRule(RelativeLayout.ALIGN_LEFT,R.id.imageViewClk);
params.addRule(RelativeLayout.ALIGN_BOTTOM,R.id.imageViewClk);
myCustomTwistedProgressBar.setLayoutParams(params);
}else if ( density == 0.75f ){
ImageView micImage = ((ImageView) findViewById(R.id.imageViewClk));
Drawable drawing = micImage.getDrawable();
Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
// Get current dimensions
int width = bitmap.getWidth();
int height = bitmap.getHeight();
LayoutParams params = new LayoutParams((int)(height/14.88), (int)(height/14.88));
params.setMargins((int)(width/2.27), 0, 0, (int)(height/2.69));
params.addRule(RelativeLayout.ALIGN_LEFT,R.id.imageViewClk);
params.addRule(RelativeLayout.ALIGN_BOTTOM,R.id.imageViewClk);
myCustomTwistedProgressBar.setLayoutParams(params);
}
在不同的屏幕尺寸上一切正常,但是当我尝试检查 480x854 分辨率时,自定义视图的垂直对齐不正确。在相同的屏幕尺寸上用 480x800 检查,它又可以工作了。然后我跳了一大步,检查了 GalaxyTab,水平和垂直对齐是错误的。现在我的第一个想法是位图宽度和高度是图像而不是实际调整大小的图像视图。所以我花了很多时间试图获得图像视图的真实大小,甚至选择了 viewTreeObserver 但结果都是一样的——正确的、不变的(未缩放的?)位图大小。所以肯定问题不在这里,我无法进一步解决。有谁知道为什么对齐不能正常工作?
PS:至于布局 xml 文件中的图像视图,我有 2 个配置 long 和 notlong,但此图像在两者中具有相同的描述:
<ImageView
android:src="@drawable/cloking"
android:id="@+id/imageViewClk"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_centerHorizontal="true"
android:layout_above="@+id/imageViewProcess"
android:adjustViewBounds="true"
android:cropToPadding="false"
android:layout_marginTop="60dp"
android:scaleType="fitXY">
</ImageView>