0

Androidで複数の画面サイズを適切に処理する際の問題は、何千回も話題になっています。しかし、私はm問題の解決策を見つけることができませんでした。一言で言えば、カスタムプログレスバーをimageViewに揃える必要があります。imageView用の3セットのドローアブル(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をチェックインしましたが、水平方向と垂直方向の配置が間違っていました。さて、私の最初は、ビットマップの幅と高さが実際のサイズ変更された画像ビューではなく、画像の1つであるということでした。そのため、imageviewの実際のサイズを取得することに多くの時間を費やし、viewTreeObserverを使用しましたが、結果はすべて同じでした。正しい、変更されていない(スケーリングされていない?)ビットマップサイズです。問題がここにないことを前向きに考えているので、私はそれ以上進むことができませんでした。アライメントが正しく機能しない理由を誰かが知っていますか?

PS:レイアウトxmlファイルの画像ビューに関しては、longとnotlongの2つの構成がありますが、この画像の説明は両方で同じです。

<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 に答える