piątek, 20 kwietnia 2012

Wyświetlanie okna popup.

Wczoraj zabrałem się za okno popup, które ma się pojawiać pomiędzy poziomami. Będzie zawierało gratulacje, bieżącą punktację, najwyższy wynik w grze, być może również z internetu. Nie powinno być to nic skomplikowanego. Zacząłem od definicji układu next_level.xml:
 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/popup_layout"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/header"
        style="@style/textattributes"
        android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:text="@string/nxt_lvl_header" />

    <RelativeLayout 
        android:layout_width="fill_parent" android:layout_height="wrap_content"  
        android:orientation="vertical" >
    <TextView
        style="@style/textattributes"
            android:id="@+id/scoreText"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="@string/scoreTxt" />
    <TextView
        style="@style/textattributes"
            android:id="@+id/scoreVal"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="0" 
            android:layout_toRightOf="@id/scoreText" 
            android:layout_marginLeft="3dp"/>
    </RelativeLayout>
    <LinearLayout
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:gravity="bottom|center"
        android:orientation="vertical" >

        <Button
            android:id="@+id/nxt_lvl_dismis"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/dismiss" />
    </LinearLayout>

</LinearLayout> 

Trzeba pamiętać o nadaniu identyfikatora układu - android:id="@+id/popup_layout". Będzie on potrzebny przy tworzeniu okna:

View popup = infl.inflate(R.layout.next_level, 
                (ViewGroup)findViewById(R.id.popup_layout));
pw = new PopupWindow(popup, 300, 470, true);

Teraz bardzo ważna sprawa. Jeżeli nasz popup ma reagować na zdarzenia - kliknięcie przycisku na przykład, to musi mieć tło. Ja chciałem, żeby było prześwitujące:


Bitmap tlo = Bitmap.createBitmap(300, 470, Bitmap.Config.ARGB_8888);
Canvas canvTemp = new Canvas(tlo);
canvTemp.drawColor(Color.parseColor("#D8591385"));
BitmapDrawable drw = new BitmapDrawable(tlo);
pw.setBackgroundDrawable(drw); 

Potem dodam ładne zaokrąglone narożniki. Tło ustawione, teraz można dodać zdarzenia do przycisków i ustawić wartości:

TextView txtScore = (TextView)popup.findViewById(R.id.scoreVal);
txtScore.setText(""+score);
dismissButton.setOnClickListener(new OnClickListener() {
 public void onClick(View v) {
  pw.dismiss();
 }
});

Teraz gdy wszystko gotowe, wyświetlamy okienko:

pw.showAtLocation(popup, Gravity.CENTER, 0, 0);

Co dziwne, w dokumentacji piszą, że metoda dismiss() działa tylko dla okienek uruchomionych za pomocą metody showAsDropdown(), a w pozostałych przypadkach nic nie robi. Jednak okienko się zamyka. Wrócę do tego problemu później. Właściwie to nawet nie jest problem :)

Reaktywacja

Blog ten powstał dawno temu. A właściwie nie powstał, ale został założony i jak miliony innych porzucony. Ale coś się zmieniło.
Od kilku tygodni pracuję nad grą na Androida. Nie jest to nic szczególnie zaawansowanego. Ot, skrzyżowanie River Raid z Galaxy Invaders. Celem jest opanowanie programowania na Androida, coś, o czym myślałem od dłuższego czasu. No przecież ileż można pisać zapytania i formatki.
Na chwilę obecną mam zrobione:
  • wątek obsługujący animację z ograniczeniem fps,
  • animację typu sprite,
  • przewijane tło,
  • podstawową kontrolę kolizji,
  • odtwarzanie dźwięku - podstawy
Obecnie pracuję nad samymi mechanizmami gry: poziomami, punktacją, scenariuszem. Czyli korzystam z tego co napisałem.
To tyle na początek. Życzcie mi powodzenia.