Chciałbym ustawić Drawablejako tapetę urządzenia, ale wszystkie funkcje tapet akceptują Bitmaptylko s. Nie mogę użyć, WallpaperManagerponieważ mam wersję 2.1.
Ponadto moje drawable są pobierane z sieci i nie są w nim przechowywane R.drawable.
Wydaje mi się, że coś znalazłem: jeśli „draw” jest rysowalny, chcę przekonwertować go na bitmapę, to: Bitmap bitmap = ((BitmapDrawable) draw) .getBitmap (); Zrób sztuczkę!
Wygląda to na jedyną odpowiedź, która działałaby dla każdego rodzaju dającego się rysować, a także ma szybkie rozwiązanie dla dającego się rysować, który jest już BitmapDrawable. +1
czy to naprawdę najlepszy sposób? Z pewnością dający się rysować może być innego typu, co spowodowałoby wyjątek runtimeException? Na przykład może to być ninePatchDrawble ...?
@Dori możesz owinąć kod w instrukcji warunkowej, aby sprawdzić, czy rzeczywiście jest to BitmapDrawableprzed przesłaniem: if (d instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); }
Nie możesz uwierzyć w 64 głosów poparcia? Że kod działa oczywiście tylko wtedy, gdy djuż jestBitmapDrawable , w tym przypadku jest to trywialne, aby pobrać je jako bitmapy ... rozbije się ClassCastExceptionwe wszystkich innych przypadkach.
Zakładając, że otrzymujesz niepustą Drawable, dlaczego trzeba sprawdzić, czy szerokość i wysokość nie są równe 0? Ponadto, dlaczego musisz używać setBounds (), jeśli mają ten sam rozmiar?
Dobre rozwiązanie! Android 8.0 / sdk 26 ApplicationInfo.loadIcon (PackageManager pm) zwraca AdaptiveIconDrawable。 Użyj kodu, aby mi pomóc w rzutowaniu AdaptiveIconDrawable na bitmapę。
Żadne z nich nie działa z zasobem VectorDrawable . Występuje następujący błąd -android.graphics.drawable.VectorDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
Więc po obejrzeniu (i korzystania) z innych odpowiedzi, wydaje się, że wszystko manipulacja ColorDrawablei PaintDrawableźle. (Zwłaszcza na Lollipop) wydawało się, że Shaderzostały poprawione, więc stałe bloki kolorów nie były obsługiwane poprawnie.
Używam teraz następującego kodu:
publicstaticBitmap drawableToBitmap(Drawable drawable){if(drawable instanceofBitmapDrawable){return((BitmapDrawable) drawable).getBitmap();}// We ask for the bounds if they have been set as they would be most// correct, then we check we are > 0finalint width =!drawable.getBounds().isEmpty()?
drawable.getBounds().width(): drawable.getIntrinsicWidth();finalint height =!drawable.getBounds().isEmpty()?
drawable.getBounds().height(): drawable.getIntrinsicHeight();// Now we check we are > 0finalBitmap bitmap =Bitmap.createBitmap(width <=0?1: width, height <=0?1: height,Bitmap.Config.ARGB_8888);Canvas canvas =newCanvas(bitmap);
drawable.setBounds(0,0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);return bitmap;}
W przeciwieństwie do innych, jeśli zadzwonisz setBoundsna Drawableprzed prosząc, aby włączyć go do bitmapy, to narysować bitmapę w odpowiednim rozmiarze!
@androiddeveloper, jeśli granice zostały ustawione, po prostu i tak je wykorzystujemy. W niektórych przypadkach jest to potrzebne, gdy nie określono żadnych granic i nie ma on rzeczywistego rozmiaru (np. ColorDrawables w niektórych przypadkach). Tak więc szerokość i wysokość wynosi 0, dajemy ciągniętą 1x1 w taki sposób, że faktycznie coś rysuje. W takich przypadkach można argumentować, że możemy sprawdzić typ ColorDrawable, ale działa to w 99% przypadków. (Możesz go zmodyfikować według własnych potrzeb).
@ Chris.Jenkins Co jeśli nie ma granic, a teraz będą nowe? Chciałbym również zadać inne pytanie: jaki jest najlepszy sposób ustawienia rozmiaru bitmapy (nawet dla BitmapDrawable), która zostanie zwrócona?
Sugeruję uważne przeczytanie kodu. Jeśli Drawablenie ma ustawionych granic, używa IntrinsicWidth/Height. Jeśli oba mają wartość <= 0, ustawiamy płótno na 1px. Masz rację, jeśli Drawablenie ma granic, to minie trochę (1x1 jest w większości przypadków), ale WYMAGANE jest to dla rzeczy takich, ColorDrawablektóre NIE mają wewnętrznych rozmiarów. Gdybyśmy tego nie zrobili, wyrzuciłoby to Exception, nie można narysować 0x0 na kanwie.
mutate()tworzyłby kopię, pozostawiając oryginalny rysunkowy sam, co negowałoby problem powrotu do pierwotnych granic. Rzadko zmieniam kod na podstawie tych punktów. Jeśli wymaga tego przypadek użycia, dodaj inną odpowiedź. Sugeruję, aby utworzyć kolejne pytanie dotyczące skalowania mapy bitowej.
Android zapewnia non czysty roztwór przewin: BitmapDrawable. Aby uzyskać mapę bitową, będziemy musieli podać identyfikator zasobu R.drawable.flower_picna a, BitmapDrawablea następnie rzutować na a Bitmap.
Najnowsza biblioteka rdzenia Androidx (androidx.core: core-ktx: 1.2.0) ma teraz funkcję rozszerzenia:Drawable.toBitmap(...) do konwersji Drawable na mapę bitową.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.