grafika 2D i animacja obsługa rotacji i elementy 3D-OpenGL w Androidzie Krzysztof Czech, 2 rok IZ Grzegorz Duszyński, 2 rok IZ Daniel Engel, 2 rok IZ Łukasz Olech, 2 rok IZ Radek Wilczak, 2 rok EKA
Nadpisywanie elementów GUI Canvas - płótno Paint - rysik Paint paint = new Paint();
Rysowanie prymitywów public void drawcolor (int color) public void drawpaint (Paint paint) public void drawarc (RectF oval, float startangle, float sweepangle, boolean usecenter, Paint paint) public void drawcircle (float cx, float cy, float radius, Paint paint) public void drawline (float startx, float starty, float stopx, float stopy, Paint paint) public void drawrect (Rect r, Paint paint) public void drawtext (String text, float x, float y, Paint paint)
Przykład wykorzystania obiektów Canvas i Paint
Przykład wykorzystania obiektów Canvas i Paint cd.
Animacja Android oddaje nam do użytku 2 typy animacji: Tween animation Frame-by-frame animation
Deklaracja animacji Tween w XML
Implementacja animacji podpięcie jej pod Button
Animacja Frame by Frame reprezantacja w XML
Struktura plików w projekcie androida umieszczane plików i bitmap Zdjęcia dodane do folderów drawable zostają automatycznie konwertowane do optymalnej wielkości. W celu zachowania oryginalnego rozmiaru należy stworzyć inny katalog.
Implementacja animacji Frame by Frame i podłożenie jej pod Button Metoda post powoduje, że obiekt starter zostaje dodane do kolejki wątku działającego w ramach odświeżania GUI.
Tworzenie dynamicznych animacji tworzenie osobnego wątku przeciążanie klasy SurfaceView przeciążanie klasy Thread - tworzenie wątku
Przykładowa klasa SurfaceView
Android - Rotacja
Rotacja 1: Wtęp Zmiana orientacji telefonu usuwa naszą aktywność i stwarza ją na nowo za pomocą metody oncreate(). Dlatego należy pamiętać o zapamiętywaniu danych dynamicznych naszej Layout wertykalny: res/layout/main.xml Layout horyzontalny: res/layout-land/main.xml Link: http://www.bogotobogo.com/android/android15rotation. html
Rotacja 2: Sposoby Trzy podejścia do problemu przechowywania danych: 1. Metoda onsaveinstancestate() i obiekty typu Bundle ograniczenie pamięciowe do Boundle obiekty zapisywane muszą ulegać serializacji nadzór Androida 2. Metoda onretainnonconfigurationinstance() oraz getlastnonconfigurationinstance() i obiekt typu Object przechowywanie dowolnego obiektu - Object również nadzór Androida 3. Metoda onconfigurationchanged() zwolnienie Androida z obsługi obrotu ekranu całkowite przejęcie zdarzenia obrotu
Rotacja 3: DIY Rotation Jeżeli nie chcemy żeby android pomagał nam z obsługą naszej rotacji należy w pliku AndroidManifest.xml wstawić: android: configchanges= " orientation keyboardhidden" w <activity> W konsekwencji, zmiana orientacji spowoduje wywołanie metody onconfigurationchanged() którą należy przedefiniować.
Rotacja 4: Rezygnacja z obrotu W jaki sposób zablokować zmianę orientacji ekranu? Należy dodać do AndroidManifest.xml (w części dotyczącej aktywności naszej aplikacji) wpis: android:screenorientation = "portrait" - widok wertykalny "landscape" - widok horyzontalny "sensor" - orientacja ekranu zależna od położenia telefonu (domyślnie zmiana orientacji jest związana z wysunięciem/schowaniem klawiatury)
OpenGL ES 2.0 API do grafiki 3D w urządzeniach mobilnych
Czym jest OpenGL ES? Uniwersalne API do grafiki 3D w systemach wbudowanych Bazuje na OpenGL 3D Stworzony i nadzorowany przez Khronos group
Czym się wyróżnia wersja ES? W przeciwieństwie do wersji z PC: Nie ma wsparcia dla glbegin ani glend. Zamiast tego używa się vertex arrays i obiektów vertex buffer. Wspieranymi prymitywami są punkty, linie, trójkąty. Czworokąty nie są wspierane. Nie ma wsparcia dla listy wyświetlaczy.
Podstawy OpenGL ES 2.0 package com.droidnova.android.games.vortex; import android.app.activity; import android.os.bundle; public class Vortex extends Activity { // Tworzymy statyczny TAG do logowania private static final String LOG_TAG = Vortex.class.getSimpleName(); private VortexView _vortexview; // Ustawiamy widok dla aktywności @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); _vortexview = new VortexView(this); setcontentview(_vortexview); http://www.droidnova.com/android-3d-game-tutorial-part-i,312.html
Podstawy OpenGL ES 2.0 package com.droidnova.android.games.vortex; import android.content.context; import android.opengl.glsurfaceview; public class VortexView extends GLSurfaceView { private VortexRenderer _renderer; public VortexView(Context context) { super(context); // Tworzymy Renderer i ustawiamy go jako obowiązujący w widoku _renderer = new VortexRenderer(); setrenderer(_renderer); http://www.droidnova.com/android-3d-game-tutorial-part-i,312.html
Podstawy OpenGL ES 2.0 package com.droidnova.android.games.vortex; import... //Lista importów public class VortexRenderer implements GLSurfaceView.Renderer { private float _red = 0.9f; private float _green = 0.2f; private float _blue = 0.2f; @Override public void onsurfacecreated(gl10 gl, EGLConfig config) { @Override public void onsurfacechanged(gl10 gl, int w, int h) { gl.glviewport(0, 0, w, h); @Override public void ondrawframe(gl10 gl) { // Definiujemy kolor tła gl.glclearcolor(_red, _green, _blue, 1.0f); // Czyścimy bufor kolorów zdefiniowanym kolorem gl.glclear(gl10.gl_color_buffer_bit); http://www.droidnova.com/android-3d-game-tutorial-part-i,312.html
Podstawy OpenGL ES 2.0 // Dodajemy setcolor do renderera public void setcolor(float r, float g, float b) { _red = r; _green = g; _blue = b; // Dodajemy obsługę dotyku do widoku public boolean ontouchevent(final MotionEvent event) { queueevent(new Runnable() { public void run() { _renderer.setcolor(event.getx() / getwidth(), event.gety() / getheight(), 1.0f); ); return true; http://www.droidnova.com/android-3d-game-tutorial-part-i,312.html
OpenGL ES 2.0 Pierwsze prymitywy
// Dodaj do VortexRenderer private ShortBuffer _indexbuffer; private FloatBuffer _vertexbuffer; private short[] _indicesarray = {0, 1, 2; // Wskaźniki private int _nrofvertices = 3; // Trójkąt ma 3 wierzchołki private void inittriangle() { ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 3 * 4); // l. wierz. * l. trójk. * l. bajtów vbb.order(byteorder.nativeorder()); //Big endian, Little endian _vertexbuffer = vbb.asfloatbuffer(); //Bufor wierzchołków ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2); ibb.order(byteorder.nativeorder()); _indexbuffer = ibb.asshortbuffer(); // Bufor indeksów float[] coords = { -0.5f, -0.5f, 0f, // (x1, y1, z1) 0.5f, -0.5f, 0f, // (x2, y2, z2) 0f, 0.5f, 0f // (x3, y3, z3) ; _vertexbuffer.put(coords); //Wypełnij bufor współrzędnymi _indexbuffer.put(_indicesarray); //Wypełnij bufor indeksami _vertexbuffer.position(0); //Ustaw wskaźnik wewnątrz buforu _indexbuffer.position(0);
@Override public void onsurfacecreated(gl10 gl, EGLConfig config) { // Przygotowujemy Trójkąty gl.glenableclientstate(gl10.gl_vertex_array); inittriangle(); @Override public void ondrawframe(gl10 gl) { // Ustawiamy kolor do czyszczenia buforu gl.glclearcolor(_red, _green, _blue, 1.0f); // Czyścimy nim bufor gl.glclear(gl10.gl_color_buffer_bit); // Ustawiamy kolor używany do rysowania gl.glcolor4f(0.5f, 0f, 0f, 0.5f); // Definiujemy wierzchołki do rysowania gl.glvertexpointer(3, GL10.GL_FLOAT, 0,_vertexBuffer); // Rysujemy wierzchołki gl.gldrawelements(gl10.gl_triangles, _nrofvertices, GL10.GL_UNSIGNED_SHORT, _indexbuffer);
// Ustaw kąt private float _angle; public void setangle(float angle) { _angle = angle; // Rysuj @Override public void ondrawframe(gl10 gl) { gl.glrotatef(_angle, 0f, 1f, 0f); // Dokonujemy rotacji gl.glcolor4f(0.5f, 0f, 0f, 0.5f); // Kolor początkowy //Obsługa dotyku publuic boolean ontouchevent(final MotionEvent event) { queueevent(new Runnable() { public void run() { _renderer.setcolor(event.getx() / getwidth(), event.gety() / getheight(), 1.0f); _renderer.setangle(event.getx() / 10); ); return true;