0

こんにちは、ギャラリー/カメラの画像を使用してページを追加または削除できる水平ギャラリーのようなものを構築しようとしています。

大きなビットマップで動作するようにしようとしているので、アルゴリズムを使用してビットマップをスケーリングし、各ページのイメージビューに設定しています。アルゴリズムには、ImageView の幅/高さが必要です (縮小するため)。

私が抱えている問題は、カスタム PagerAdapter メソッドが実行されたときに、ImageView の幅/高さが不明であるため (getWidth/getHeight が 0 を返す)、機能しないことです。

public Object instantiateItem(ViewGroup collection, int position) {
        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.document_page, null);
        ((ViewPager) collection).addView(view, 0);

        ImageView imageView = (ImageView) view.findViewById(R.id.imageView);

        // Obtain the image file URI
        // Call algorithm to get scaled bitmap using ImageView width and height --> PROBLEM: imageView.getWidth()/Height() return 0!!
        // Set ImageView with scaled bitmap to avoid OutOfMemory Exception

        return view;
}

何を指示してるんですか?

ありがとう。

4

4 に答える 4

3

画像クライアント側のスケーリング:

画像が既にデバイス上にある場合、画像をスケーリングするために独自のアルゴリズムは必要ありません。AnImageViewには、次のように設定できるScaleTypeがあります。

imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)

android:scaleType(または属性を持つ XML で)。

残りの問題は、URL から画像を取得して に表示する方法ImageViewです。SmartImageViewAndroid-Query (より強力)などのライブラリを使用して、非同期で (つまり、UI スレッドをブロックせずに) 実現します。

たとえば、SmartImageView を使用すると、次のようなものを使用できます。

myImageView.setImageUrl("http://www.awesomeimages.com/myawesomeimage.jpg");

そのページの例を読むだけで、はるかに多くのオプションがあります。

サーバー側のスケーリング

たとえば、特定の URL パラメーターによってトリガーされる何らかのサイズ変更アルゴリズムがある場合は、このソリューションを使用して、必要に応じて幅と高さを渡します (おそらく上記のライブラリのいずれかを使用)。

と言ってgetWidth()戻っgetHeight()てきたので、 に設定したと0を見てください。の場合は問題ありませんが、そうしなければならない場合、最終的な画像と同じ縦横比のローカルの透明なダミー画像を使用することを検討してください (「実際の画像」が設定されるまで)。layout_widthlayout_heightImageViewfill_parentwrap_content

于 2013-01-17T20:05:35.017 に答える
0

justInbounds オプションでビットマップ ファクトリを使用します。したがって、ビットマップをRAMにロードせずに、ビットマップの次元を返すだけです。

  options.inJustDecodeBounds = true;
于 2013-01-17T23:09:08.650 に答える
0

ビットマップを画面のサイズに合わせてサンプリングしてみてください (ビットマップの解像度を取得するにはinJustDecodeBoundsを使用し、画面の解像度を取得するにはdisplayMatricsを使用します)。

透過性がない場合は、8888 の代わりにRGB 565 形式のビットマップ デコードを使用することもできます。これにより、使用中のメモリの約 1/4 を節約できます。

いずれにせよ、ビットマップの取り扱いに関するこのチュートリアルを読むことをお勧めします。

于 2013-01-17T23:27:24.337 に答える