0

在 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>
4

1 回答 1

0

Android 会缩放图像,但会保持图像的纵横比。您无法使用布局设置控制纵横比(据我所知)。我会通过选择一些我想要支持的屏幕比例并制作更多资源(具有您支持的宽高比的图像)来解决这个问题。代码如下所示:

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();

ImageView image = (ImageView) findViewById(R.id.imageViewClk);
if(width/height == aspectRatio1)
{
    image.setImageResource(R.id.imageAspect1);
} else if( width/height == aspectRatio2...
于 2012-09-26T13:43:28.620 回答