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>