1

私が抱えている問題はいくつかありますが、すべて関連しています。私が解決したものもありますが、私が見つけた解決策が最終製品から私を止めている可能性があります. これは多くの人が遭遇するかなり一般的な問題であると確信しているため、ここですべての問題と解決策について言及します。

最終的な結果 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 レイヤー) をすべて読み込み、画像をズームする機能を持たせる最良の方法は何ですか。

ここに必要なコードを含むプロジェクトを作成しました

4

1 に答える 1

1

私はいくつかの解決策を見つけました。問題 1: コードを完成させ、ここにある TouchImageView を使用した後。メモリ不足エラーが発生しなくなりました。すべてのレイヤーを問題なくロードできます。

2 番目と 3 番目の問題も、TouchImageView を使用することで解決されました。私はそれに満足していますが、それがどのように機能するのか、その理由を理解するのに多くの時間を費やしたので、クラスにもっとコメントしてもらいたいと思っていますが、最終的には失敗しました.

私が抱えていた最後の大きな問題は、ピンチ ズームが一番上のレイヤーのみをズームすることでした (予想どおり)。これに対する修正は、TouchImageview クラスをわずかに変更し、マトリックス変更リスナーの機能を追加することでした。これで、マトリックスが変更されるたびに、マトリックスがリスナーに返され、ベース イメージを含むすべてのレイヤーのマトリックスが更新されます。これにより、すべての画像が同時にズームされ、ズームに関係なく、ラベルがベース画像の同じ場所を指すようになります。

これは、マトリックスの変更をリスナーに通知するために使用される非常に単純なインターフェイスです。

public interface IOnMatixChangedListener
{
        public void onMatrixChanged(Matrix matrix);
}
于 2012-01-25T02:51:21.403 に答える