2011-11-20 20 views
6

Myślę, że jest problem z moim ImageView. stworzyłem galerię sztuki, gdzie można dotknąć obrazu i umieścić go w moim ImageView poniżej:Umieszczanie dużego obrazu w ImageView nie działa

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@drawable/fonddegrade"> 

<Gallery android:layout_height="wrap_content" 
    android:id="@+id/gallery" 
    android:layout_width="fill_parent" /> 

<ImageView android:layout_below="@+id/gallery" 
    android:layout_height="wrap_content" 
    android:id="@+id/laphoto" 
    android:layout_width="wrap_content" 
    android:layout_centerHorizontal="true"/> 

ta jest doskonale pracy z małym obrazem, ale nie z dużego obrazu (3264 * 1952). Kiedy go dotknę (tak, próbując umieścić go w ImageView), mam błąd i awarię mojej aplikacji. Oto mój kod Java do wyświetlania obrazu:

 public void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
      setContentView(R.layout.photo); 

      File images; // Trouver le bon endroit de stockage 
      if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) 
       images = new File("/sdcard/MyPerformance/Photo"); 
      else 
       images = this.getFilesDir(); 

      images.mkdirs(); 
      File[] imagelist = images.listFiles(new FilenameFilter(){ 
       @Override 
       public boolean accept(File dir, String name) 
       { 
        return ((name.endsWith(".jpg"))||(name.endsWith(".png"))); 
       } 
      }); 

      mFiles = new String[imagelist.length]; 
      for(int i = 0 ; i< imagelist.length; i++) 
      { 
       mFiles[i] = imagelist[i].getAbsolutePath(); 
      } 
      mUrls = new Uri[mFiles.length]; 
      for(int i = 0; i < mFiles.length; i++) 
      { 
       mUrls[i] = Uri.parse(mFiles[i]);  
      } 

      imgView = (ImageView)findViewById(R.id.laphoto); 
      if(mFiles.length != 0) 
       imgView.setImageURI(mUrls[0]); 

      gallery = (Gallery) findViewById(R.id.gallery); 
      gallery.setAdapter(new ImageAdapter(this)); 

      gallery.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
        imgView.setImageURI(mUrls[position]); 
       } 
      }); 
    } 

czy problem wynika z setImageURI (ale nie sądzę, że to jest przyczyną, ponieważ jest to praca z małym obrazku) lub ze względu na wielkość zdjęcie.

Jakie rozwiązanie możesz rozwiązać, aby rozwiązać ten problem? Masz moje dzięki.

PS: Dlaczego moje "Hello" są zawsze usunięte?

+0

Więc jaki jest problem? Czy to się psuje? Przy okazji Twój obraz wygląda naprawdę bardzo, Android może stracić pamięć podczas ładowania. –

+0

Wstępnie zmień rozmiar obrazu - ten jest dość świni. Produktem komercyjnym jest http://www.avs4you.com/AVS-Image-Converter.aspx – mozillanerd

+0

Ponadto, jeśli po prostu sprawdzisz błąd awarii w kodzie logcat, da ci to wskazówkę ?? Zrób to i opublikuj błąd, jeśli nadal masz wątpliwości. – Peterdk

Odpowiedz

8

Twój obraz jest prawdopodobnie zbyt duży dla Androida i przestał działać w pamięci. Aplikacje mogą mieć nawet 16 MB dostępnej pamięci. Twoje zdjęcie zajmuje 3264 * 1952 * 4 = ~ 25,5 MB (szerokość wysokość argb). Najlepiej może zmienić rozmiar obrazów na mniejsze.

Patrz: http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html
Następnie: Strange out of memory issue while loading an image to a Bitmap object
Wreszcie: VM running out of memory while getting images from the cache

+2

To jest to! Twoje linki pomogły mi bardzo, mój problem był taki sam jak drugi link i użyłem tego samego rozwiązania, aby pozbyć się tego problemu. Musimy więc skalować zbyt duży obraz, aby dobrze działał. – FR073N

+0

Cieszę się, że działały :) Wydawało się, że podobny problem. –

+0

(Pamiętaj również, aby zaakceptować odpowiedź) –

1

Oto bitmapy [util klasy, aby pomóc z obsługą dużych bitmap.

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 

public class BitmapUtils { 

    public static int calculateInSampleSize(
      BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     // Calculate ratios of height and width to requested height and width 
     final int heightRatio = Math.round((float) height/(float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 

     // Choose the smallest ratio as inSampleSize value, this will guarantee 
     // a final image with both dimensions larger than or equal to the 
     // requested height and width. 
     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 

    } 

    return inSampleSize; 
} 


    public static Bitmap decodeSampledBitmapFromResource(String pathToFile, 
       int reqWidth, int reqHeight) { 

     // First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(pathToFile, options); 

     // Calculate inSampleSize 
     options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 
     return BitmapFactory.decodeFile(pathToFile, options); 
    } 

} 
0

Szukałem wiele godzin i przeszedłem wszystkie linki i wreszcie znalazłem to.

Glide.z (getContext()) .load (selectedImageUri) .into (imageView);

i poślizg wykonuje wszystkie operacje backendu. To sprawiło, że mój dzień.

Glide Github Link: https://github.com/bumptech/glide

+0

Podczas gdy ten link może odpowiedzieć na pytanie, tylko odpowiedzi linkowe są odradzane w Stack Overflow, możesz poprawić tę odpowiedź, biorąc kluczowe części linku i wstawiając je do swojej odpowiedzi, co zapewnia Twoja odpowiedź jest nadal odpowiedzią, jeśli link zostanie zmieniony lub usunięty :) – WhatsThePoint

Powiązane problemy