/ / Jak zaimplementować maskę obrazu? - Android, interfejs użytkownika, układ androida

Jak zaimplementować maskę obrazu? - Android, interfejs użytkownika, układ androida

Situtation:

Pracuję nad małą aplikacją, która powinnaumożliwić użytkownikowi wyzwalanie czegoś w zależności od tego, która część ekranu kliknęła. Wyobraź sobie obrazek pluszowego misia, a jeśli klikniesz nos, to znaczy "nos". To, co zrobiłem, jest umieszczane w układzie xml a LinearLayout. Ponieważ muszę pokrywać różne rozmiary ekranu, nie ustawiłem tła w pliku układu xml.

Snippet form xml:

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/viewMain"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="visible" >
<LinearLayout
android:id="@+id/viewThouShaltRespondToClicks"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:orientation="vertical"
android:longClickable="true"
android:visibility="visible" />

<!-- mask -->
<LinearLayout
android:id="@+id/viewInvisibleMask"
android:visibility="invisible"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
</LinearLayout>
</FrameLayout>

A następnie w przypadku zdarzenia onCreate sprawdzam rozdzielczość wyświetlania i za pomocą setBackgroundResource () ustaw odpowiednie tło. Przygotowałem obrazy tła dla każdej rozdzielczości.

final Point QVGA = new Point(240,320);  // portrait
// Obtain the screen resolution if the device
Display defaultDisplay = ((WindowManager)this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
Point displayResolution = new Point(defaultDisplay.getWidth(), defaultDisplay.getHeight());
if (displayResolution.equals(QVGA))
{
viewThouShaltRespondToClicks.setBackgroundResource(R.drawable.image_to_be_clicked_upon_240x320);
viewInvisibleMask.setBackgroundResource(R.drawable.mask_240x320);

}
else if ... // check for another resolution

Nawet jeśli obraz w zasobach nie znajduje się wpoprawny wymiar jest rozciągany / zmniejszany do rozmiaru ekranu. Byłoby to OK, o ile stosunek szerokości do wysokości tła jest podobny do stosunku wyświetlania, a wynikowy obraz nie jest zbytnio kędzierzawy. Ale jest problem, wyjaśniony poniżej.

Aby wykryć, który region został kliknięty, regionsama może mieć nieregularny kształt Podjąłem następujące podejście. Tworzę obraz-maskę (bmp) o takich samych wymiarach jak obraz tła, tylko że ma białe tło, a klikalne obszary są w różnych kolorach. Kolor identyfikuje obszar. Wszystko, co muszę, to uzyskać współrzędne zdarzenia kliknięcia (tutaj nie ma problemu), przejdź do obrazu maski i odczytaj kolor piksela na tych współrzędnych. Problem polega na tym, że obraz maski nie ma poprawnego rozmiaru. Na moim urządzeniu jest ustawiony na 1200 x 700, ale myślę, że przybiera on dowolny dowolny rozmiar na innych urządzeniach.

Pierwsze pytanie: czy istnieje sposób, aby przekonać niewidoczny układ do załadowania obrazu tła, a następnie rozciągnąć / zmniejszyć go do rozmiaru wyświetlania, tak jak to się dzieje w przypadku widocznego układu?

Innym podejściem byłoby załadowanie obrazu maski (bmp, png) do pewnej struktury pamięci i zmiana jego rozmiaru do rozmiaru wyświetlania. Próbowałem z coś takiego:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;   // do not scale
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
bitmapMask = BitmapFactory.decodeResource(this.getResources(), R.drawable.mask, options);
// on this place stretch shrink should follow but I have no idea how

Ale nie wiem, jak skalować bitmapy do odpowiedniego rozmiaru.

Jakieś sugestie?

Odpowiedzi:

0 dla odpowiedzi № 1

Pierwsze pytanie: tak, możesz mieć osobny widok w swoim układzie zawierający obraz maski i ustawić go jako niewidoczny android:visibility=invisible.

Drugie pytanie: możesz odczytać wartość piksela z mapy bitowej Bitmap.getPixel(). Dokumenty są tutaj.


0 dla odpowiedzi nr 2

Prosta sugestia. Możesz mieć obraz referencyjny w widoku obrazu za prawdziwym obrazem. Tak więc oba obrazy są ładowane dokładnie w ten sam sposób, umieszczane w ImageViews, a następnie wstawiane do względnego poziomu. W ten sposób powinny być jednakowej wielkości i tylko jeden z nich jest widoczny.

To może nie być bardzo ładny sposób na zrobienie tego, i nie jestem pewien, czy to zadziała, ale możesz go wypróbować.