2012-06-11 17 views
10

Mam RelativeLayout z załadowanym bitmapy na przykładzie dotykowy V2 z Pragmatic Bookshelf - http://media.pragprog.com/titles/eband3/code/Touchv2/src/org/example/touch/Touch.javaview.getDrawingCache() działa tylko raz

Dodałem oddzielny przycisk z onclicklistener który po kliknięciu załadowania obraz z galerii. Na aktywność rezultacie obraz jest załadowany jako bitmapy do RelativeLayout:

public void getPictureFromFile(Uri targetUri){ 
    try { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = scale(getContentResolver() 
       .openInputStream(targetUri)); 
     workinprogress = BitmapFactory.decodeStream(
       getContentResolver().openInputStream(targetUri), 
       null, options); 
     view.setImageBitmap(workinprogress); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

Jeden kliknij przycisk Dalej, łapię wizerunku relativelayout używając:

   thepicture.buildDrawingCache(true); 
      Bitmap bm = Bitmap.createBitmap(thepicture.getDrawingCache()); 

Proces działa wspaniale - dla pierwszego obrazu. Po ponownym załadowaniu kolejnego obrazu bitmapa przekazana dalej jest taka sama jak oryginał. Próbowałem thepicture.invalidate() i thepicture.resetDrawableState() before getDrawingCache(), ale nie wydaje się, aby zaktualizować obraz do nowo załadowanego obrazu, chociaż układ ramki wyświetla prawidłowy obraz.

Czy jest coś, czego nie rozumiem, aby odświeżyć rysunek Cache, który muszę zaimplementować dla drugiego załadowanego obrazu?

Odpowiedz

38

Aby działało więcej niż raz, musisz użyć view.setDrawingCacheEnabled(true) za każdym razem przed i view.setDrawingCacheEnabled(false) za każdym razem po wywołaniu view.getDrawingCache(). Zobacz przykład:

imageView.setDrawingCacheEnabled(true); 
imageView.buildDrawingCache(true); 
File imageFile = new File(Environment.getExternalStorageDirectory(), 
     "Pictures/image.jpg"); 
FileOutputStream fileOutputStream = new FileOutputStream(imageFile); 
imageView.getDrawingCache(true).compress(CompressFormat.JPEG, 100, 
     fileOutputStream); 
fileOutputStream.close(); 
imageView.setDrawingCacheEnabled(false); 
+2

+1 to uratowało mnie przed marnowaniem godzin pracy. Nice one dmytro –

+5

Jako alternatywną metodę włączania pamięci podręcznej rysunku, możesz również wywołać 'imageView.buildDrawingCache()', następnie pobrać pamięć podręczną rysunku, a następnie wywołać 'imageView.destroyDrawingCache()'. Zobacz http://developer.android.com/reference/android/view/View.html#buildDrawingCache() – lilbyrdie

+0

wykonał zadanie, dzięki. –

Powiązane problemy