Czy ktoś mógłby mi spróbować wyjaśnić dlaczego
public void addView(View child) {
child.setDrawingCacheEnabled(true);
child.setWillNotCacheDrawing(false);
child.setWillNotDraw(false);
child.buildDrawingCache();
if(child.getDrawingCache() == null) { //TODO Make this work!
Log.w("View", "View child's drawing cache is null");
}
setImageBitmap(child.getDrawingCache()); //TODO MAKE THIS WORK!!!
}
ZAWSZE rejestruje, że pamięć podręczna rysunku ma wartość null, i ustawia wartość mapy bitowej na wartość null?
Czy muszę narysować widok przed ustawieniem pamięci podręcznej?
Dzięki!
getDrawingCache()
używaniaView#draw
doCanvas
podejściaOdpowiedzi:
Miałem również ten problem i znalazłem odpowiedź:
źródło
jeśli
getDrawingCache
to zawszereturning null
faceci: użyj tego:Źródła: https://stackoverflow.com/a/6272951/371749
źródło
getLayoutParams
zamiast v.getWidth () i v.getHeight ()?ImageView
nie otrzymałeś jeszcze obrazu, więc wydaje się, że jest równe 0. To wyglądałoby inaczej dla kodu różnych osób, ale upewnij się, że wywołanieloadBitmapFromView()
jest zdecydowanie po TwójImageView
zawiera obraz.Podstawowym powodem uzyskania wartości zerowej jest to, że widok nie jest zwymiarowany. Wszystkie próby użycia view.getWidth (), view.getLayoutParams (). Width itp., W tym view.getDrawingCache () i view.buildDrawingCache (), są bezużyteczne. Dlatego musisz najpierw ustawić wymiary do widoku, np:
(Już ustawiłeś 'szerokość' i 'wysokość' jak chcesz lub otrzymałeś je z WindowManager, itp.)
źródło
Zamiast tego używam tego.
źródło
Pracuj najlepiej 4me
źródło
Jeśli widok, który chcesz złapać, naprawdę pojawia się na ekranie, ale zwraca wartość null. Oznacza to, że przechwytujesz widok, zanim Menedżer okien go wygeneruje. Niektóre układy są bardzo skomplikowane. Jeśli układ zawiera zagnieżdżone układy, layout_weight..etc, powoduje kilka razy, że relayout uzyskuje dokładny rozmiar. Najlepszym rozwiązaniem jest poczekanie, aż menedżer okien zakończy pracę, a następnie wykonanie zrzutu ekranu. Spróbuj umieścić getDrawingCache () w module obsługi.
źródło
Odpowiedzi @ cV2 i @ nininho działają dla mnie.
Jednym z innych powodów, dla których odkryłem na własnej skórze, było to, że widok, który miałem, generował widok o szerokości i wysokości 0 ( tj. Wyobraź sobie, że masz TextView z tekstem łańcucha pustego ciągu ). W takim przypadku getDrawingCache zwróci wartość null, więc po prostu sprawdź to. Mam nadzieję, że to pomoże niektórym ludziom.
źródło
Błąd może być spowodowany tym, że widok jest zbyt duży, aby zmieścić się w pamięci podręcznej rysunków .
Otrzymałem wyjaśnienie mojego problemu „View.getDrawingCache zwraca wartość null” z moich dzienników:
Dokumentacja systemu Android mówi również : urządzenia z systemem Android mogą mieć zaledwie 16 MB pamięci dostępnej dla jednej aplikacji. Dlatego nie możesz załadować dużej mapy bitowej.
źródło
Próbuję utworzyć liczbę n obrazów dynamicznie na podstawie widoku.
Myślę, że ten kod komuś pomoże ...
źródło
To prosty i skuteczny sposób na uzyskanie mapy bitowej
źródło