2012-02-15 13 views
6

OPIS PROBLEMU:
Przetestowałem następujące dwie metody, aby utworzyć snaphot bitmapowy z widoku (np. RelativeLayout w tym przypadku). Obie metody działają doskonale w przypadku widoków, których wymiary (na przykład szerokość i wysokość) są mniejsze niż wymiary ekranu urządzenia (na przykład 480 x 900). Widoczna część widoku jest przechwytywana i zapisywana w bitmapie. Niestety bitmapa jest czarna w niewidocznej części widoku.Android: Bitmapa z przewymiarowanego widoku

PYTANIE:
Jak mogę uchwycić także niewidoczną część widoku?

KOD:

public class NewRelativeLayout extends RelativeLayout{ 

private Bitmap bmp; 

public NewRelativeLayout(Context context){ 
    super(context); 
    this.setLayoutParams(new RelativeLayout.LayoutParams(2000,2000)); 
    // add here methods to configure the RelativeLayout or to add children 
    } 

//This is the first method 
public void makeSnapshot_Method1(){ 
    this.setDrawingCacheEnabled(true); 
    bmp = Bitmap.createBitmap(this.getDrawingCache()); 
    this.setDrawingCacheEnabled(false); 
    } 

//This is the second method 
public void makeSnapshot_Method2(){ 
    bmp = Bitmap.createBitmap(2000, 2000, Bitmap.Config.ARGB_8888); 
    Canvas helpCanvas = new Canvas(bmp); 
    this.draw(helpCanvas); 
    } 

}

Odpowiedz

0

Zależy, na której obraz chcesz przechwycić obraz z tle widok lub planie. Tak czy inaczej, musisz pobrać od nich obiekt Drawable, przesłać je do BitmapDrawable i pobrać bitmapę z ich. Kod: -

BitmapDrawable bd=(BitmapDrawable) view.getBackground(); //if you need background image 
BitmapDrawable bd=(BitmapDrawable) view.getDrawable(); //if you need foreground image (Only available to some views who have an android:src xml property) 
Bitmap bm=bd.getBitmap(); 

Mam nadzieję, że to zadziała.

+0

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? –

+0

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

+0

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

0

Próbuję również dowiedzieć się, dla ListView, aby uzyskać wszystkie wiersze, które nie są na ekranie.

Znalazłem wiele rzeczy chciałbym podzielić:

Tu ktoś pyta, czy bitmapy mogą być tworzone z myślą, że nie jest sporządzony: Bitmap from View not displayed on Android

Oto oni twierdzą, że to duplikat i to również odpowiedział poprawnie (?) Zawiera adres URL z pewnym kodowaniem, który jest stary i nie kompiluje się. Nie pomogło mi także ewentualne powtórzenie pytania. Android get full View as Bitmap

myślę, postaram się zrobić to za pomocą tej metody: List View using bitmap Już wpadł na ten sam pomysł, teraz muszę jeszcze dowiedzieć się jak to zrobić.

Mam nadzieję, że wykorzystasz niektóre z tych informacji.

1

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; 
} 
Powiązane problemy