4

現在、私はSDカードから画像を表示するアプリを作っています。基本的には、MediaStoreのピッカーのカメラからアルバムを作成し、写真を追加します。イメージギャラリー(ローカルイメージ)を実装する方法

私は2つの方法の実装しようとした:私は、グリッドビューを表示したいいけないカスタムPagerAdapter

  • viewpagerをビューを返すために

    1. カスタムBaseAdapterと標準ギャラリーアプリをので、すぐに全画面表示にする必要があります。その後、私は左と右のスワイプを無効にし、クリックだけを聞きたい。

      atm両方の方法がポートレートモードで動作します。私がランドスケープに切り替えると、いくつかの画像がドロップするだけです。

      03-20 12:20:56.515: W/OpenGLRenderer(17398): Bitmap too large to be uploaded into a texture 
      

      その後にメモリ不足のエラーがあります。 OOMとギャラリーに関する問題がいっぱいになるとスタックオーバーフローが発生するので、convertViewはBaseAdapterのgetViewで常にnullであるため、ビューをリサイクルして機能させる必要があります。

      私はビューにリサイクラーを使用しました。私はビューを2に制限し、ポートレートモードはメソッド1(ギャラリーを使用)に対して機能しました。風景はまだ私に同じ問題を与える。方法2の場合

      (viewflipper)それは...しかし、ポートレートモードがここで働く

      @Override 
      public void destroyItem(ViewGroup container, int position, Object object) { 
      

      WICHがところで呼び出されることはありませんでのビューを処理します。風景がまだクラッシュします。

      ビットマップを取得するための私の方法:

      public static Bitmap getBitmap(Context ctx, int imageId, ImageView target) { 
      
          String file = getPath(ctx, imageId); 
      
          BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
          bmOptions.inJustDecodeBounds = true; 
      
          BitmapFactory.decodeFile(file, bmOptions); 
          WindowManager mgr = (WindowManager)   ctx.getSystemService(Context.WINDOW_SERVICE); 
      
          int scaleFactor = 1; 
      
          if (mgr != null) { 
           // Get the dimensions of the View 
           int targetW = mgr.getDefaultDisplay().getWidth(); 
           int targetH = mgr.getDefaultDisplay().getHeight(); 
           Log.d(TAG, "Image width + height=" + targetW + "," + targetH); 
      
      
           int photoW = bmOptions.outWidth; 
           int photoH = bmOptions.outHeight; 
           // Determine how much to scale down the image 
           scaleFactor = Math.min(photoW/targetW, photoH/targetH); 
      
          } else { 
           Log.d(TAG, "Target is null"); 
          } 
      
          // Get the dimensions of the bitmap 
          // Decode the image file into a Bitmap sized to fill the View 
          bmOptions.inJustDecodeBounds = false; 
          bmOptions.inSampleSize = scaleFactor; 
          bmOptions.inPurgeable = true; 
          logHeap(ImageHelper.class); 
      
          Bitmap bm = BitmapFactory.decodeFile(file, bmOptions); 
      
          if (target != null) { 
           target.setImageBitmap(bm); 
          } 
          return bm; 
      } 
      
      ファインワークス

      が、私は画面サイズを取得するには、ウィンドウマネージャを使用して知っているが、私はそれを膨らませるとき、私のImageViewのは、まだサイズ(0,0)であるので、それがあります。その後私はドロウアブルまたはAPKに含まれ、他のリソースを使用していけないことに注意してください

      ...何も動いていないようにみえ

      imgView.setLayoutParams(new Gallery.LayoutParams(
            Gallery.LayoutParams.FILL_PARENT, 
            Gallery.LayoutParams.FILL_PARENT)); 
          imgView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
      
      を呼び出します。 このギャラリーは、撮影した画質でSDカードまたはカメラから画像を読み込むことができるはずです。不潔なことに、ギャラリーはディレクトリ内にあるように多くのイメージを扱うことができるはずです。

      誰かが次の質問で私を助けてくれますか?

      1. デフォルトギャラリーをフルスクリーン表示にしてグリッド表示をブロックする方法はありますか?この方法では、自分のビューを作成するのではなく、画像を提供するアダプタしか必要ありません。 (多分これがOOMのクラッシュを解消する)
      2. 私のビットマップデコード機能は大丈夫ですか?私は風景の変更をキャッチするためにいくつかのハックでビルドする必要がありますか?
      3. ビューアやギャラリーを使って、私が必要とする種類のギャラリーを作るにはどうすればいいですか?
      4. 誰かがクラッシュしないフルスクリーンギャラリーのサンプルコードを持っていますか?
  • +0

    ギャラリーを作成しようとしていますか、ギャラリーにアクセスしようとしていますか?また、デコードロジックもうまくいきます。 – lokoko

    答えて

    1

    これは過去に数回遭遇した問題です。 Googleはこれについて実際に記事を投稿しました。

    問題は、画像をデコードするために使用するinSampleSizeにあります。異なるデバイスは異なる画面とメモリサイズ(VMヒープサイズは12〜64またはそれ以上になる可能性があります)があるため、すべての方法で同じ方法でイメージをデコードできません。たとえば、12Mbのヒープメモリを持つ320x240デバイスのイメージは、所定のinSampleSizeでなければならず、1280x720の64Mbのヒープメモリデバイスは、別のinSampleSize(より大きいサイズ)をユーザーが使用する必要があります。

    記事i攻撃は、特定の高さと幅の画像を効率的にレンダリングする方法を示しています。最後のコードセグメントに注意を払い、ファイルを「事前に開く」ようにして、後で「フルデコード」のためのinSampleSizeを計算します。

    この勧告も追加したいと思います。

    1. SDを使用すると時間がかかり、これは、アプリケーションが遅いと、ハングアップする原因となりますので、これが行われる(新しいスレッドまたはasyncTaskを呼び出し、非同期の方法で「getBitmap」機能を使用します低中級端末での悪い印象

    2. 複数の「ビットマップビットマップ=新しいビットマップ()」を作成しないでください。読み込まれたビットマップがRAMに保存され、一度割り当てられたことを認識する必要がありますガベージコレクタがそれらを取得するのが「より困難」であることを確認してください。

    3. Bitma p overをnullにします。これは、あなたが12Mbの最大ヒープRAMを持っていると想像してください。あなたのアプリは今8Mbを使用しています。ガベージコレクタが起動し、未使用のRAMを取得します。 ImageViewにデータを割り当てた後に10ビットマップを高速化することは決してできません。何らかの理由で参照を保持しています。それぞれのビットマップが500KbのRAMをとることを見て、あなたのアプリはクラッシュします。使用後は必ずビットマップをヌルにしてください。

    4. 最後にGoogleプラットフォームツールで提供されているDDMSを使用してください(デバッグやメモリ使用量を確認するにはEclipseにアクセスできます。また、ガベージコレクションによってアプリの動作を確認することもできます)。

    関連する問題