Również szukałem rozwiązania tego problemu, a ostatecznie udało mi się wymyślić własne rozwiązanie, które jest całkiem proste.
W moim przypadku miałem LinearLayout
, który zawierał pewną liczbę elementów View
, z których niektóre czasami nie znajdowały się na ekranie, pionowo pod końcem granic ekranu. Udało mi się zapisać View
jako bitmapę (patrz loadBitmapFromView()
, poniżej), ale miałam problemy, gdy rozszerzyła się ona poza dolną część ekranu.
Moje rozwiązanie polegało na wykonaniu części LinearLayout
części kompozytu ScrollView
.
np.
to:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/my_linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<!-- Some Views added here at runtime -->
</LinearLayout>
Stał:
Uwaga wykorzystanie wrap_content
celu zapewnienia Scrollview Wagi do wysokości treści.
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:id="@+id/my_linear_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<!-- Some Views added here at runtime -->
</LinearLayout>
</ScrollView>
To wydawało się upewnić, że Offscreen przedmioty mogą być ręcznie rozplanowany kiedy chciałem zapisać View
postaci bitmapy. Użyłem następującej metody, aby zapisać bitmapę. Znalazłem to dużo wcześniej na SO, ale nie mogę znaleźć pytania, aby właściwie się z nim zapoznać (kimkolwiek jesteś - dziękuję!).
W poniższej metodzie przechodzę w odniesieniu do powyższego LinearLayout
(my_linear_layout
).
public static Bitmap loadBitmapFromView(View view) {
Bitmap bitmap = null;
// width measure spec
int widthSpec = View.MeasureSpec.makeMeasureSpec(
view.getMeasuredWidth(), View.MeasureSpec.AT_MOST);
// height measure spec
int heightSpec = View.MeasureSpec.makeMeasureSpec(
view.getMeasuredHeight(), View.MeasureSpec.AT_MOST);
// measure the view
view.measure(widthSpec, heightSpec);
// set the layout sizes
int left = view.getLeft();
int top = view.getTop();
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
int scrollX = view.getScrollX();
int scrollY = view.getScrollY();
view.layout(left, top, width + left, height + top);
// create the bitmap
bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
Bitmap.Config.ARGB_8888);
// create a canvas used to get the view's image and draw it on the
// bitmap
Canvas c = new Canvas(bitmap);
// position the image inside the canvas
c.translate(-view.getScrollX(), -view.getScrollY());
// get the canvas
view.draw(c);
return bitmap;
}
Dzięki Twórcy za szybką reakcję. Metoda view.getDrawable() jest obsługiwana tylko przez widoki, które "trzymają" obraz pierwszego planu w środku, jak na przykład ImageView. Wszystkie inne widoki, takie jak RelativeLayouts, LinearLayouts, TextView itp. Nie obsługują tej metody. Większość forów internetowych zaleca metodę 1 lub 2 (zobacz mój wpis), aby zrobić zrzut ekranu bitmapy (tj. Tło plus pierwszy plan) z widoku. Problem nie został rozwiązany w przypadku zbyt dużych wyświetleń. Jakieś inne pomysły? –
Cóż, już wspomniałem, że view.getDrawable() nie jest obsługiwany przez każdy widok w samym poście. Te dwie metody dają pełny obraz, w tym części poza ekranem, możesz spróbować wstawić te dwa osobne obrazy w jednym widoku (jeśli jest to przezroczysty obraz tła png), używając obszaru roboczego i niestandardowego widoku i uzyskać możliwe do wyciągnięcia stamtąd, chociaż nigdy tego nie próbowałem, więc nie mogę powiedzieć, jak to zadziała, ale jeśli mógłbyś to osiągnąć, możesz osiągnąć to, czego potrzebujesz. – noob
Metoda getDrawingCache() służy tylko do wyświetlania obrazu na ekranie, więc nie sądzę, że będzie działać. Używanie getDrawingCache (true) może ci pomóc. Inną możliwością może być zmiana rozmiaru widoku przy użyciu opcji LayoutParams tak, aby pasował do ekranu, a następnie pobranie z niego bufora rysunku. – noob