2012-01-11 57 views
0

私は多くの問題があり、すべて関連しています。いくつか私は解決しましたが、私が見つけた解決策は最終製品から私を止めているかもしれません。 私はこれがかなり一般的な問題であると確信していますので、ここではすべての問題と解決策について言及します。アンドロイドで拡大縮小されたレイヤード画像を拡大する

最終結果 私は上に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エラーが発生します。私はまた、画質が低下してズームするときに画像の拡大縮小が問題になると思います。

第2号。 私が見た限りでは、画像の1つが透明でない場所にpngを重ねることはできません。透明でない画像(ベース画像)のみを表示する透過画像は表示されません。

これを解決するには、FrameLayoutの背景をベースイメージに設定し、3つのレイヤーだけをそのレイアウトの子として残します。

第3号 画像を拡大します。 私はここに解決策があるかもしれないが、How can I get zoom functionality for images?が見つかりましたが、エミュレータにはマルチタッチがなく、デバイスがそれを泳いだときにデバイスが気に入らなかったので、まだテストしていません。私は現在、テストする他のデバイスがありません。

outOfMemoryErrorを取得せずに4つの画像(基本+ 3レイヤー)をすべて読み込み、画像を拡大する機能を持つ最良の方法は何ですか?

私は必要なコードでプロジェクトを作成したhere

答えて

0

私はいくつかの解決策を見つけました。 問題1: コードを完了し、TouchImageViewを使用した後にhereが見つかりました。私はもはやメモリ不足のエラーを取得しません。問題なくすべてのレイヤーを読み込むことができます。

TouchImageViewを使用して2番目と3番目の問題を解決しました。私はそれに満足していますが、クラスの仕組みを理解しようと多くの時間を費やした結果、理由は分かりましたが、最終的には失敗しました。

私が最後にした大きな問題は、ピンチズームを使用すると、(予想通り)最上位レイヤーがズームするだけだった。これに対する修正は、TouchImageviewクラスを少し変更して、マトリックスが変更されたリスナーの機能を追加することでした。今度はマトリックスが変更されると、マトリックスはリスナーに戻され、ベース・イメージを含むすべてのレイヤーのマトリックスが更新されます。これにより、すべての画像が同時にズームされ、ズームに関係なく、ラベルがベース画像上の同じ位置を指しているようになります。

これは、マトリックスの変更のリスナーに通知するために使用する非常にシンプルなインターフェイスである

public interface IOnMatixChangedListener 
{ 
     public void onMatrixChanged(Matrix matrix); 
} 
関連する問題