私が抱えている問題はいくつかありますが、すべて関連しています。私が解決したものもありますが、私が見つけた解決策が最終製品から私を止めている可能性があります. これは多くの人が遭遇するかなり一般的な問題であると確信しているため、ここですべての問題と解決策について言及します。
最終的な結果 3 つのレイヤー (透明な png) が上にある基本イメージがあります。表示するレイヤーはユーザー次第です。各レイヤーは、より多くの情報をベース イメージに追加します。私の状況では、ベース画像は星の画像です。ユーザーが追加のレイヤーを追加すると、星座の境界、星の名前、グリッドが表示されます。また、空の一部をより鮮明に表示するために、領域を拡大できる必要があります。
最初の問題 画像サイズが 2 つ (1324 × 1872) 大きいため、OutOfMemory エラーが発生します。
を使用して画像をスケーリングすることで解決
/**
* This method scales an image in the assets directory and returns a
* BitmapDrawable object that can be passed to an images setImageBitmap or a
* views setBackgroundDrawable by passing this method into the constructor
* of BitmapDrawable.
* eg ViewGroup.setBackgroundDrawable(
* new BitmapDrawable(getScaledBitMap(this, imagePath, 2)));
*
* @param context
* @param imgFullPath
* @param imageSize
* @return
* @throws IOException
*/
public static Bitmap getScaledBitMap(Context context, String imgFullPath,
int imageSize) throws IOException
{
InputStream instream;
instream = context.getAssets().open(imgFullPath);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = imageSize;
Bitmap bitmap=BitmapFactory.decodeStream(instream, null, options);
return bitmap;
}
このコードは役に立ちましたが、3 つのレイヤーをロードするときに OutOfMemory エラーが発生します。また、品質が低下しているため、ズーム時に画像のスケーリングが問題になると思います。
第二号。私が見つけた限りでは、画像の1つが透明でない場所にpngを重ねることはできません。透明な画像は表示されず、透明でない画像 (ベース画像) のみが表示されます。
FrameLayout の背景をベース イメージに設定し、3 つのレイヤーだけをそのレイアウトの子として残すことで、これを解決しました。
第 3 号 画像の拡大。ここで解決策となるものを見つけました画像のズーム機能を取得するにはどうすればよいですか? 、しかし、エミュレーターにはマルチタッチがなく、泳ぐときにデバイスが気に入らなかったため、まだテストしていません。現在、テストする他のデバイスはありません。
outOfMemoryError を取得せずに 4 つの画像 (ベース + 3 レイヤー) をすべて読み込み、画像をズームする機能を持たせる最良の方法は何ですか。
ここに必要なコードを含むプロジェクトを作成しました