2015-07-21 26 views
7

Mam Activity, gdzie mam obraz tła w ImageView i dziewięć przezroczystych przycisków na górze obrazu.Android: Mała wydajność przy użyciu dużego obrazu w ImageView

http://i.stack.imgur.com/GGQqd.png

Kiedy dotknij dowolnego przycisku robię RelativeLayout pojawia się w górnej części tła.

http://i.stack.imgur.com/JvKQK.jpg

Problem polega na: Gdy używam dużą rozdzielczość obrazu jako tło w układzie wydajność jest bardzo słaba.

Używam PNG obraz 2048 x 1536, a to waga wynosi około 500k. Gdy używam mniejszego obrazu, takiego jak 1024 x 768 aplikacja działa poprawnie, ale wygląda okropnie.

Czy istnieje ograniczenie lub metoda korzystania z dużych obrazów bez utraty wydajności?

Odpowiedz

10

Ta bitmapa to ogromna. Wspomniane 500 000 to skompresowany rozmiar. Obrazy są nieskompresowane w pamięci podczas korzystania z nich. W rzeczywistości patrzysz na 2048 × 1536 × 4 = 12582912 = ponad 12 MB pamięci.

Jeśli używasz urządzenia takiego jak Nexus 9, który ma tę rozdzielczość ekranu, możesz rozsądnie założyć, że ma on również pamięć, GPU i przepustowość magistrali, aby poradzić sobie z obrazem tego rozmiaru. Jeśli jednak używasz urządzenia o niższej rozdzielczości (większość urządzeń jest, pamiętaj, że nawet Full HD to tylko 65%), to ten obraz jest fenomenalnie marnotrawny w pamięci. Możesz teraz kupić urządzenia o niskim końcu z ekranem 240x320, gdzie pełnoekranowa bitmapa to zaledwie 2,5% rozmiaru obrazu.

Będziesz musiał skalować ten obraz po załadowaniu. Użyj BitmapFactory.Options, aby ustawić żądany rozmiar przed załadowaniem obrazu.

Co więcej, umieszczasz tekst bezpośrednio nad nim. Renderowanie tekstu wymaga przezroczystości alfa, która wymaga próbkowania podstawowego obrazu. Jeśli umieścisz tekst na nieprzezroczystym tle i umieścisz to na wierzchu, zaoszczędzisz również trochę obciążenia procesora graficznego, ale nie jestem pewien, ile osiągniesz. To może nie być taka wielka sprawa.

+0

Dzięki za odpowiedź. Na przykład testuję aplikację na tablecie ** 2560 x 1600 **, a tło nie wygląda zbyt dobrze, jeśli zmniejszam ją. Próbuję użyć 'BitmapFactory.Options' –

1

Możesz użyć Dave Morissey's Subsampling Scale Image View jako kropli w zastępstwie standardowego widoku obrazu.

układ XML:

<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:scaleType="fitXY" 
        android:id="@+id/photo"/> 
      </RelativeLayout> 

Ustaw obraz w kodzie oraz wyłączyć touch:

photo = (SubsamplingScaleImageView) view.findViewById(R.id.photo); 
photo.setOnTouchListener(new View.OnTouchListener() { 
          @Override 
          public boolean onTouch(View v, MotionEvent event) { 
           return true; 
          } 
         }); 
photo.setImage(ImageSource.uri(Uri.fromFile(new File("/somepath/file.png")))); 

build.gradle:

compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'

Powiązane problemy