0

ユーザーが次のボタンを押したときに表示されている画像を更新することになっているimageviewを含むフレームレイアウトがあります(スライドショーを考えてください)。このようにこの画像ビューに入れたいすべての画像は同じ寸法です。アクティビティの開始時にimageviewによって表示される最初の画像は、res / drawable-hdpiディレクトリにあり、他の画像はアセットディレクトリにあります。問題は、これらの画像はすべて同じサイズですが、imageviewにスワップした画像が最初の画像よりも小さく表示されることです。

レイアウトパラメーターに関しては、フレームレイアウトのlayout_widthとlayout_heightがwrap_contentに設定されており、imageviewも同様です。scaleTypeパラメーターをすべての可能な値に設定しようとしましたが、同じ結果が得られます。したがって、res / drawable-hdpiに保存されている画像とアセットのスケーリングが異なる場合を除いて、この動作は発生しません。

では、ユーザーがこれらの画像を循環するときに、画像ビューのサイズを維持するための最良のアプローチは何でしょうか。

これがフレームレイアウトとイメージビューのXMLです

<FrameLayout
  android:id="@+id/coverLayout"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true" >

  <ImageView
    android:id="@+id/coverImageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="false"
    android:scaleType="fitCenter"
    android:src="@drawable/coverImage" />
</FrameLayout>

これが私のimageviewに新しい画像をロードする私のコードです

_coverImageView = (ImageView) findViewById(R.id.coverImageView);
...
...
if (loadNewImage) {
        AssetManager assetMgr = getAssets();
        InputStream stream;
        try {
            stream = assetMgr.open("covers/" + _coverImageName);
            Drawable coverDrawable = Drawable.createFromStream(stream, _coverImageName);
            _coverImageView.setImageDrawable(coverDrawable);
        }
        catch (IOException ex) {                        
            System.out.println(ex);
        }
}
4

1 に答える 1

2

そのため、res/drawable-hdpi とアセットに保存されている画像が何らかの方法で異なる方法でスケーリングされていない限り、この動作は発生しません。

これはまさに問題です。Android は、画面の密度 (クラス) やビットマップの元のリソース フォルダーなど、いくつかのルールに基づいてビットマップをスケーリングします。この関連する質問/回答を参照してください。アセットとリソースの両方で同じ動作が必要な場合は、 のdrawable-nodpi代わりに最初のカバー画像を配置できますdrawable-hdpi

于 2012-09-07T19:22:48.527 に答える