Bab 5 Android

download Bab 5 Android

of 26

Transcript of Bab 5 Android

  • 8/19/2019 Bab 5 Android

    1/60

    MODUL 5

    PEMBUATAN GAME SEDERHANA

    1. Latar Belakang

    Setiap proses pembelajaran selalu membutuhkan media pembelajaran yang dapat

    membantu pelaksanaan proses pembelajaran. Modul ini merupakan salah satu solusi yang dapat

    membantu pelaksanaan proses pembelajaran sehingga modul ini diharapkan dapat membantu

    proses pembelajaran yang dilakukan peserta.

    2. Tujuan

    Tujuan pembuatan modul ini adalah :

    • Peserta memahami dan mengerti langkah-langkah untuk membuat game sederhana di

    Android.

    • Peserta mengetahui persiapan yang diperlukan untuk memulai membuat game di Android.

    Peserta dapat melakukan praktikum berdasarkan materi yang ada pada modul ini.

    GAME

    Graphics Android yang didukung oleh 2D graphic library dan OpenGL ES 1.0 untuk 3d

    Graphics.APIs 2D graphics yang umun dapat ditemukan di dalam package drawable. API

    OpenGL tersedia dari package Khronos OpenGL ES ditambah dengan utilitas Android OpenGL.

    Ketika memulai sebuah project,sangat penting untuk mempertimbangkan tuntutan grafis apa

    yang akan digunakan. Memvariasikan grafis yang paling baik adalah dilakukan dengan berbagai

    teknik.Misalnya,grafis dan animasi untuk aplikasi yang agak statis harus dibuat berbeda jauh

    dengan grafis dan animasi untuk game atau render 3D.

  • 8/19/2019 Bab 5 Android

    2/60

    2D Graphics

    Menggambar grafik adalah teknik yang sangat simple. Paket-paket android seperti

    android.graphics.drawable dan android.view.animation dimana kita menemukanclass-class

    yang digunakan untuk menggambar grafik 2D.

    Disini kita membahas pengenalan gambar grafis dalam aplikasi android anda. Akan dibahas

    dasar-dasar menggunakan object untuk menggambar grafis, bagaimana menggunakan class

    drawable, dan bagaimana membuat animasi yang baik (bergerak, meregang, memutar).

    Drawable

    Drawable adalah abstraksi umum untuk “seuatu yang bisa digambar”. Anda aka n menemukan bahwa drawable class dapat mendefinisikan berbagai jenis spesifik drawable garfis, termasuk

    BitmapDrawable, ShapeDrawable, PictureDrawable, PictureDrawable, LayerDrawable, dan

    beberapa lagi.

    Ada tiga cara untuk mendefinisikan dan memberi contoh Drawable. Menggunakan gambar yang

    disimpan dalam project resource, menggunakan file XML yang mendefinisikan Drawable

    properties, atau menggunakan normal class constructor. Kita akan membahas dua teknik pertama

    karena menggunakan constructor adalah sesuatu yang baru)

    Membuat dari Resource Image

    Cara mudah untuk menambhakan grafis ke aplikasi anda adalah dengan referensi file image dari

    project resource. Format file yang didukung adalah PNG, JPG, dan GIF. Teknik ini jelas akan

    menjadi pilihan untuk aplikasi ikon, logo, atau grafis lainnya seperti yang digunakan dalam

    game.

    Untuk menggunakan sebuah image resource, cukup tambahkan file anda keres/drawable / project

    directory . Dari sana , anda dapat referensi., anda dapat refernsi dari kode kode atau XML layout..

    Catatan : Image resource ditempatkan dires / drawable / mungkin secara otomatis dioptimalkan

    dengan lossless image compresion dengan alat bantu aapt. Sebagai contoh, warna sebuah PNG

    yang tidak memerlukan lebih dari 256 warna dapat dikonversi ke PNG 8-bit dengan color

  • 8/19/2019 Bab 5 Android

    3/60

    palette. Hal ini akan menghasilkan kualitas image yang sama tetapi membutuhkan memori yang

    lebih sedikit. Jadi harus sadar bahwa citra biner ditempatkan dalam direktori ini dapat berubah

    selama mem-build. Jika anda berencana untuk membaca image sebagai bit untuk mengubahnya

    menjadi suatu bitmap, menempatkan image Anda dires / baku / folder instead , di mana mereka

    tidak akan optimal.

    Contoh kode :

    Potongan kode berikut menunjukkan bagaimana membuild sebuah ImageView yang

    menggunakan imagedari drawable resource dan menambahkannya ke layout.

    LinearLayout mLinearLayout;protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    // Create a LinearLayout in which to add the ImageView

    mLinearLayout = new LinearLayout(this);

    // Instantiate an ImageView and define its properties

    ImageView i = new ImageView(this);

    i.setImageResource(R.drawable.my_image);

    i.setAdjustViewBounds(true); // set the ImageView bounds to match the

    Drawable's dimensionsi.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT,

    LayoutParams.WRAP_CONTENT));

    // Add the ImageView to the layout and set the layout as the content view

    mLinearLayout.addView(i);

    setContentView(mLinearLayout);

    }

    Dalam kasus lain, anda mungkin menangani resource image sebagai drawable. Untuk

    melakukannya, buat drawable dari resource seperti

    Resources res = mContext.getResources();

  • 8/19/2019 Bab 5 Android

    4/60

    Drawable myImage = res.getDrawable(R.drawable.my_image);

    Contoh XML

    Potongan XML di bawah ini menunjukkan bagaimana cara menambahkan resource drawable ke

    ImageView dalam layout XML.

    Creating from resource XML

    Setelah Anda mendefinisikan Drawable dalam XML , simpan file di res / drawable / direktori

    proyek Anda. Lalu, mengambil objek dengan memanggil Resources.getDrawable (),.

    Setiap subclass drawable yang mendukung method inflate() dapat didefinisikan dalam XML dan

    yang dipakai oleh aplikasi Anda. Setiap drawable yang mendukung XML menggunakan atribut

    khusus XML yang membantu mendefinisikan properti objek.

    XML yang mendefinisikan TransitionDrawable.

    Dengan XML ini disimpan dalam file res/drawable/expand_collapse.xml.

    Kode berikut ini akan memberi contoh yang TransitionDrawable dan mengaturnya sebagai isi

    dari ImageView:

  • 8/19/2019 Bab 5 Android

    5/60

    Resources res = mContext.getResources();

    TransitionDrawable transition = (TransitionDrawable)

    res.getDrawable(R.drawable.expand_collapse);

    ImageView image = (ImageView) findViewById(R.id.toggle_image);

    image.setImageDrawable(transition);

    Lalu transisi ini dapat berjalan (untuk1 second) dengan :

    transition.startTransition(1000);

    Shape Drawable

    Ketika Anda ingin menggambar beberapa dinamis grafis dua dimensi, object ShapeDrawable

    mungkin akan sesuai dengan kebutuhan Anda. Dengan ShapeDrawable, pemrograman Anda

    dapat menggambar bentuk primitif dan gaya mereka dengan cara apapun.

    ShapeDrawable merupakan perpanjangan dari drawable, sehingga Anda dapat menggunakan

    salah satu, mungkin karena latar belakang sebuah View, ditetapkan dengan

    setBackgroundDrawable (). Berikut ini merupakan perpanjangan dasar class View untuk

    menggambar ShapeDrawable :

    public class CustomDrawableView extends View {

    private ShapeDrawable mDrawable;

    public CustomDrawableView(Context context) {

    super(context);

    int x = 10;

    int y = 10;

    int width = 300;

    int height = 50;mDrawable = new ShapeDrawable(new OvalShape());

    mDrawable.getPaint().setColor(0xff74AC23);

    mDrawable.setBounds(x, y, x + width, y + height);

    }

    protected void onDraw(Canvas canvas) {

  • 8/19/2019 Bab 5 Android

    6/60

    mDrawable.draw(canvas);

    }

    }

    Dengan custom View, itu bisa digambar sesuai keinginan anda. Dengan contoh diatas kita bisa

    menggambar suatu shapepada suatu kegiatan :

    CustomDrawableView mCustomDrawableView;

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    mCustomDrawableView = new CustomDrawableView(this);

    setContentView(mCustomDrawableView);}

    Class ShapeDrawable (seperti banyak jenis lainnya dapat di draw dalam paket

    android.graphics.drawable) memungkinkan Anda untuk menentukan berbagai sifat drawable

    dengan metode public. Beberapa properti yang mungkin ingin anda sesuaikan meliputi alpha

    transparency, color filter, dither, opacity and color.

    Tween Animation

    Sebuah animasi tween dapat melakukan serangkaian transformasi sederhana (posisi, ukuran,

    rotasi, dan transparansi) pada isi dari View object Jadi, jika Anda memiliki objek TextView,

    Anda dapat memindahkan, memutar, membesarkan, atau mengecilkan teks. Jika memiliki

    gambar latar belakang, gambar latar belakang akan berubah bersama dengan teks. Paket animasi

    menyediakan semua class yang digunakan dalam sebuah animasi tween.

    Urutan instruksi animasi mendefinisikan animasi tween, ditetapkan oleh XML atau kode

    Android. Seperti mendefinisikan tata letak, file XML dianjurkan karena lebih mudah dibaca,

    dapat digunakan kembali, dan swappable dari hard-coding animasi. Pada contoh di bawah ini,

    kami menggunakan XML.

  • 8/19/2019 Bab 5 Android

    7/60

    Instruksi animasi menentukan transformasi yang akan terjadi, ketika mereka akan dilakukan, dan

    berapa lama mereka harus menerapkan. Transformasi dapat berurutan atau bersamaan -

    misalnya, Anda dapat memiliki isi TextView bergerak dari kiri ke kanan, dan kemudian berputar

    180 derajat, atau Anda dapat memindahkan dan memutar teks secara bersamaan. Setiap

    transformasi membutuhkan set parameter khusus, dan juga satu set parameter umum (misalnya,

    waktu mulai dan durasi) .

    Animasi file XML mengikuti dalamres / Anim / direktori proyek Android Anda. File harus

    memiliki elemen root: , , , , elemen interpolator, atau

    elemen yang menampung kelompok-kelompok dari elemen ini.

    Untuk membuat mereka terjadi secara berurutan, Anda harus menentukan atribut startOffset,

    seperti ditunjukkan pada contoh di bawah ini.

  • 8/19/2019 Bab 5 Android

    8/60

    android:duration="400"

    android:fillBefore="false" />

    Koordinat layar (tidak digunakan dalam contoh ini) adalah (0,0) di sudut kiri atas, dan

    meningkatkan saat Anda pergi ke bawah dan ke kanan.

    Anda dapat menentukan bagaimana sebuah transformasi diterapkan dari waktu ke waktu dengan

    menetapkan suatu Interpolator. Android mencakup beberapa sub Interpolator yang menentukan

    kurva berbagai kecepatan: misalnya, AccelerateInterpolator mengatakan transformasi mulai

    lambat dan mempercepat. Masing-masing memiliki nilai atribut yang dapat diterapkan dalam

    XML.

    Dengan ini disimpan sebagai XML hyperspace_jump.xml di res / Anim / direktori proyek, kode

    Java berikut akan menerapkannya ke sebuah ImageView object dari layout.

    ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);

    Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this,

    R.anim.hyperspace_jump);

    spaceshipImage.startAnimation(hyperspaceJumpAnimation);

    Sebagai alternatif untuk startAnimation (), Anda dapat menentukan waktu awal untuk animasi

    dengan Animation.setStartTime (), kemudian menetapkan animasi ke View dengan

    View.setAnimation ().

  • 8/19/2019 Bab 5 Android

    9/60

  • 8/19/2019 Bab 5 Android

    10/60

    if (event.getAction() == MotionEvent.ACTION_DOWN) {

    rocketAnimation.start();

    return true;

    }

    return super.onTouchEvent(event);}

    Sangat penting untuk dicatat bahwa method start () yang disebut di AnimationDrawable tidak

    bisa dipanggil sebelum method OnCreate (), karena AnimationDrawable belum sepenuhnya

    melekat pada window. Jika Anda ingin memutar animasi, tanpa membutuhkan interaksi, maka

    Anda mungkin ingin memanggilnya dari method onWindowFocusChanged ()

  • 8/19/2019 Bab 5 Android

    11/60

    Sprite

    Untuk membuat sesuatu yang terlihat lebih daripada game yang sangat simple dalam

    bentuk 2D, akan sangat penting jika kita dapat menggambar sprite yang dianimasikan

    Ada bebrapa cara untuk menciptakan sprite yang dianimasikan, termasuk menggunakan

    XML yang didasarkan pada deklarasi dan pertukaran diantara beberapa bitmap. Ada juga cara

    alain dimana kita menggunakan sprite sheets dan fungsinya yang telah disediakan oleh fungsi

    penggambaran bitmap Android untuk menggambar setiap frame dari animasi. Dengan kata lain

    setiap frame dari animasi animasi tersebut telah disetting di dalam satu bitmap antara satu

    dengan yang lain. Setelah itu kode animasi akan menjalankan frame dari awal sampai akhir

    hingga akhirnya animasi tersebut telah selesai untuk dijalankan. Berikut ini akan saya berikan

    contoh dari sprite animasi dimana nantinya akan menampilkan panah yang memantil mantul danwarnanya berubah ubah.

    Perlu diingat bahwa Sprite tidak hanya berarti gambar gambar “Pixel Art”, tetapi juga kepada

    seluruh gambar yang digunakan di dalam game

    Sekarang kita harus menambah satu class baru dimana class tersebut merepresentasikan

    animasi sprite didalam game kita. Berikut adalah variable variable yang kita butuhkan untukmengatur dan mengendalikan animasinya:

  • 8/19/2019 Bab 5 Android

    12/60

    Berikut penjelasan 1 per 1 mengenai kegunaan dari masisng masing baris dari script di atas

    Variabel ini akan menampung bitmap yang mengandung animasi. Kenapa kita tetap

    meletakkannya di class ini daripada menjadikannya sebagai sebuah variable dari suatu thread

    yang nantinya akan menjalankan animasi. Salah satu alasannya adalah untuk menjaga class

    thread tetap bersih dan enak untuk dibaca daripada membuatnya penuh dengan variable variable.

    Yang kedua adalah untuk menjaga Enkapsulasi dimanaenkapsulasi tersebut adalah salah satu

    dari beberapa teknik pengembangan software di mana setiap class memiliki tanggung jawab

    terhadap dirinya sendiri, tidak dengan yang lain. Enkapsulasi data sangat disarankan untuk para

    programmer programmer pemula.

    2 Variabel ini berisi koordinat X dan Y di mana nantinya akan mengatur peletakkan

    sprite sesuai dengan apa yang kita inginkan di dalam layar, perlu diingat bahwa peletakkan

    dihitung dari pojok kiri atas dari screen , bukan dari tengah screen .

    Variabel ini adalah sumber dari variable persegi panjang dan mengontrol bagian bagian

    dari gambar yang akan kitarender untuk masing masing frame.

    public class OurAnimatedSpriteClass { private Bitmap mAnimation ; private int mXPos ; private int mYPos ; private Rect mSRectangle ; private int mFPS ; private int mNoOfFrames ; private int mCurrentFrame ; private long mFrameTimer ; private int mSpriteHeight ; private int mSpriteWidth ;

    mAnimation

    mXPos/mYPos

    mSRectangle

    mFPS

  • 8/19/2019 Bab 5 Android

    13/60

    Ini adalah jumlah dari frame per detik yang ingin kita tampilkan. 15-20 FPS sudah cukup

    untuk membuat mata manusia berpikir bahwa gambar itu bergerak, namun, pada platform mobile

    anda akan memiliki cukup memory untuk membuat animasi sprite terlihat sangat halus, jadi pada

    umumnya kita akan menggunakan 3-10 FPS

    Ini adalah jumlah dari frame di dalam sprite sheet yang kita animasikan

    Kita harus bisa terus memantau frame yang sedang kitarender sehingga kita dapat

    berpindah ke frame selanjutnya dengan urutan yang baik

    Variabel ini akan mengontrol waktu yang diperlukan di antara frame frame. Perlu diingat

    ingat variable ini berjenislong , bukan int.

    Variabel ini mengandung ukuran tinggi dan lebar dari suatuFrame Individu , bukan

    seluruh dari bitmap dan digunakan untuk menghitung ukuran dari source rectangle

    Sekarang kita telah mengetahui kegunaan dari masing masing variable, sekarang kita

    akan memasukannya ke dalam code:

    Kode di atas adalah kode di dalamconstructor yang kita buat, kita hanya memasukkan

    nilai nilaidefault dari setiap variable.

    Sekarang kita akan masuk ke dalam fungsi inisialisasi:

    mNoOfFrames

    mCurrentFrame

    mSrpiteHeight/mSpriteWidth

    public OurAnimatedSpriteClass () {mSRectangle = new Rect ( 0 , 0 , 0 , 0 ) ;mFrameTimer =0 ;mCurrentFrame =0;mXPos = 80 ;

  • 8/19/2019 Bab 5 Android

    14/60

    Script di atas adalah script dari fungsi inisialisasi, dapat dilihat bahwa terdapat banyak sekali

    argument namun sebenarnya maksudnya cukup mudah. Pertama tama script tersebut akan

    menyediakan Bitmap yang akan digunakan di dalam animasi. Lalu script tersebut akan mengatur

    tinggi dan lebar dari 1 buah frame dan akan berpindah ke source rectangles . Seperti telah

    dijelaskan di atas source rectangles mengatur bagian gambar yang mana yang akan kita gambardalam setiap waktu yang diberikan. Untuk memulainya mari kita jadikan frame pertama, jadi

    rectangles tersebut akan kita set untuk dijalankan pada 0,0 dan juga menjadi tinggi dan lebar

    yang sama dari frame pertama.

    Variabel yang selanjutnya ditata adalah FPS. Kita menggunakan nilai 1000/FPS karena

    timing dari frame adalah dalam satuan milisekon. Pada akhirnya hal ini juga mengatur hitungan

    frame ke dalam jumlah frame yang dianimasikan.

    Sekarang kita akan mengatur frame mana yang akan kita munculkan kita akan membuat

    fungsi baru yang akan kita namakan fungsiupdate .

    public void Initalise ( Bitmap theBitmap, int Height, int Width, int theFPS,int theFrameCount ) {

    mAnimation = theBitmap ;mSpriteHeight = Height ;mSpriteWidth = Width ;mSRectangle. top = 0 ;mSRectangle. bottom = mSpriteHeight ;mSRectangle. left = 0 ;mSRectangle. right = mSpriteWidth ;mFPS = 1000 / theFPS ;

    mNoOfFrames = theFrameCount ;}

    public void Update ( long GameTime ) {if ( GameTime > mFrameTimer + mFPS ) {

    mFrameTimer = GameTime ;mCurrentFrame +=1;

    if ( mCurrentFrame >= mNoOfFrames ) {mCurrentFrame = 0 ;

    }}

    mSRectangle. left = mCurrentFrame * mSpriteWidth ;mSRectangle. right = mSRectangle. left + mSpriteWidth ;

    }

  • 8/19/2019 Bab 5 Android

    15/60

    Di dalam parameter, dapat kita lihat salah satu variable yang dinamakan Game Time.

    Variabel ini digunakan untuk mengawasi jumlah dari waktu yang telah berjalan. Kita

    menggunakan variable ini untuk melakukan pengecekan apakah sudah saatanya untuk berganti

    frame.

    Kode ini lah yang melakukan pengecekan apakah variable Game Time sudah lebih besar

    daripada frametimer + FPS, dan maksudnya adalah waktu yang di set untuk FPS telah terlewati

    dan jika waktu yang diberikan untuk FPS telah terlewati, berarti saatnya untuk berganti frame

    telah tiba.

    Jika terlalu sulit untuk kita pikirkan, maka akan lebih mudah jika kita melihatnya melalui

    debugger . Jika waktunya untuk berganti frame telah tiba maka frame timer akan direset ke game

    time saat ini dan frame saat ini akan bertambah 1 ( berpindah frame)

    Bagian ini adalah bagian yang memastikan jika kita telah kehabisan frame untuk

    dijalankan, kita akan kembali ke awal mula. Namun kita juga tidak harus selalu kembali ke awal

    mula, kita juga bisa menggantinya dengan animasi yang lain atau hal hal lain yang kita sukai.

    Kegunaan dari kode ini adalah untuk memastikan bahwa source rectangle menampilkanframe yang tepat. Hal ini dilakukan dengan mengalikan lebar sprite dengan frame saat ini untuk

    mendapatkan batas paling kiri dari frame dan menambahkan lebar sprite ke dalam jumlah ini

    untuk mendapatkan batas paling kanan. Jika membingungkan, maka kita lihat saja melalui

    debugger untuk emngetahui apa yang sebenarnya sedang terjadi.

    if ( GameTime > mFrameTimer + mFPS ) {mFrameTimer = GameTime ;mCurrentFrame += 1;

    if ( mCurrentFrame >= mNoOfFrames ) {mCurrentFrame = 0 ;

    }

    mSRectangle. left = mCurrentFrame * mSpriteWidth ;mSRectangle. right = mSRectangle. left + mSpriteWidth ;

  • 8/19/2019 Bab 5 Android

    16/60

    Lalu, yang tersisa hanyalah untuk menggambar frame yang teat pada tempat yang tepat

    pula. Kita melakukannya dengan fungsi draw seperti di bawah ini:

    Pertama, kita perlu menciptakandestination rectangle , dimana nantinya menjadi tempat di mana

    sprite akan dirender di dalam canvas. Jadi jika kita melakukan setting X dan Y seperti di atas,

    kita bisa mengatur tinggi dan lebar dari sprite untuk menjadi bagian bawah dan kanan

    sedemikian rupa sehingga nantinya kita akan mempunyai source rectangle dengan ukuran yang

    benar.

    Hal terakhir yang perlu kita lakukan adalah untuk menggambar, untuk melakukannya kita cukup

    memanggil command draw bitmap di dalam canvas yang akan menjadi sebuah argument. Fungsi

    tersebut hanya membutuhkan bitmap untuk ditampilkan, source dan destination rectangles yang

    telah kita ciptakan dan nilai terakhir bisa diset menjadinull

    Sekarang, untuk dapat menggunakan class ini kamu harus menambahkan beberapa hal di dalam

    thread graphic . Pertama, deklarasikan variable baru di dalamclass dan lalu bisa diinisialisasikan

    di dalamconstructor seperti di bawah ini:

    Untuk dapat melampaui jumlah dari bitmap kita pertama kali harus menggunakanclass

    bitmap factory untuk meng decode resourcenya, dimana bitmap dari folder resource akan di

    decode sehingga akan dapat lolols sebagai variable. Nilai dari sisanya tergantung dari gambar

    bitmap kita.

    public void draw ( Canvas canvas ) {Rect dest = new Rect ( getXPos () , getYPos () , getXPos () + mSpriteWidth,

    getYPos () + mSpriteHeight ) ;

    canvas. drawBitmap ( mAnimation, mSRectangle, dest, null ) ;}

    Animation = new OurAnimatedSpriteClass () ;Animation. Initalise ( Bitmap. decodeResource ( res, R. drawable . idle ) , 200 , 150 , 5 , 5 ) ;

  • 8/19/2019 Bab 5 Android

    17/60

    Untuk dapat mengatur timing dari frame dengan tepat, kita harus memasukkan Game

    Timer ke dalam kode game. Kita dapat melakukannya pertama tama dengan memasukkan

    variable untuk menampung nilai dari time seperti di bawah:

    Sekarang, yang kita perlukan adalah mengatur timer ini terupdate dengan waktu pada

    setiap frame sehingga kita perlu untuk menambahkan beberapa baris pada fungsi run.

    Dengan menggunakan script di atas, maka kita memastikan bahwa time nya akan selalu

    benar.

    Kita juga perlu untuk mengupdate animasi setiap detiknya, sehingga kita perlu

    menambahkan beberapa baris lagi ke dalam fungsi run:

    Sekarang, fungsi update telah dipanggil dengan timing yang tepat, sekarang kita perlu

    menambahkan fungsi yang akan memanggil gambar sehingga animasi kita akan tergambar.

    Tambahkan baris di atas ke dalam fungsi draw sehingga gambar akan tergambar di

    tempat yang tepat dan pada saat yang tepat.Dengan begitu, maka kita telah berhasil menciptakansebuah contoh kecil dari animasi 2D.

    public void run () { while ( mRun) {

    Canvas c = null ;mTimer = System . currentTimeMillis () ;

    try {c = mSurfaceHolder. lockCanvas ( null ) ;synchronized ( mSurfaceHolder ) {

    Animation. update ( mTimer ) ;doDraw ( c ) ;

    }

    Animation. draw ( canvas ) ;

    private long mTimer ;

  • 8/19/2019 Bab 5 Android

    18/60

    Touch event

    Kelas TouchEvent merangkum informasi mengenai acara sentuhan.

    Sistem ini terus-menerus mengirim objek TouchEvent ke aplikasi sebagai sentuhan jari dan bergerak di seluruh permukaan. Sebuah peristiwa menyentuh menyediakan sebuah snapshot dari

    semua sentuhan-sentuhan selama urutan multi, yang paling penting sentuhan-sentuhan yang baru

    atau telah berubah untuk target tertentu. A multi-touch urutan dimulai ketika jari menyentuh

    permukaan pertama.Jari-jari lain kemudian dapat menyentuh permukaan, dan semua jari bisa

    bergerak di permukaan. Urutan berakhir ketika jari-jari terakhir diangkat dari permukaan.

    Sebuah aplikasi menerima event objek sentuhan pada setiap tahapan sentuhan apapun.

    Berbagai jenis objek TouchEventyang dapat terjadi adalah:

    touchstart

    Berfungsi ketika jari menyentuh permukaan layar.

    touchmove

    Berfungsi ketika jari bergerak menyentuh di permukaan layar.

    touchend

    Berfungsi ketika sentuhan jarilepas/mengangkat dari permukaan layar

    touchcancel

    Berfungsi ketika sistem pelacakan untuk membatalkan menyentuh layar.

    Objek TouchEvent digabungkan bersama untuk membentuk objek-tingkat yangtinggiGestureEventyang juga dikirim selama urutan multi-touch.

  • 8/19/2019 Bab 5 Android

    19/60

    altKey

    Jikabenar, tombol alt ditekan, jika tidak, tidak.Jika tidak ada keyboard, nilai ini adalah palsu.

    (altKey atribut Boolean);

    changedTouches

    Koleksi Touch objek mewakili semua sentuhan yang berubah dalam acara ini.

    Metode

    initTouchEvent

    Menciptakan inisialisasi baru sebuah objek TouchEvent.

    void initTouchEvent(ejaan DOMString, dicanBubble boolean, dalamcancelable boolean,

    dalam pandangan DOMWindow, secaradetail panjang, di screenX panjang, di screenY panjang,

    di clientX panjang, diclientY panjang, dictrlKey boolean, dialtKey boolean, di shiftKey boolean

    , di metaKey boolean, di TouchListmenyentuh, di TouchListt argetTouches, diTouchListchangedTouches, dalam skala float, di rotasi float );

    tipe

    Jenis peristiwa yang terjadi.

    canBubble

    Menunjukkan apakah suatu kejadian dapat menggelembung.Jika benar, acara tersebutdapat menggelembung, jika tidak, itu tidak bisa.

    http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchListClassReference/TouchList/TouchList.html%23//apple_ref/doc/js_ref/TouchList#//apple_ref/doc/js_ref/TouchListhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchListClassReference/TouchList/TouchList.html%23//apple_ref/doc/js_ref/TouchList#//apple_ref/doc/js_ref/TouchListhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchListClassReference/TouchList/TouchList.html%23//apple_ref/doc/js_ref/TouchList#//apple_ref/doc/js_ref/TouchListhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchListClassReference/TouchList/TouchList.html%23//apple_ref/doc/js_ref/TouchList#//apple_ref/doc/js_ref/TouchListhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchListClassReference/TouchList/TouchList.html%23//apple_ref/doc/js_ref/TouchList#//apple_ref/doc/js_ref/TouchListhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchListClassReference/TouchList/TouchList.html%23//apple_ref/doc/js_ref/TouchList#//apple_ref/doc/js_ref/TouchListhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchListClassReference/TouchList/TouchList.html%23//apple_ref/doc/js_ref/TouchList#//apple_ref/doc/js_ref/TouchListhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchListClassReference/TouchList/TouchList.html%23//apple_ref/doc/js_ref/TouchList#//apple_ref/doc/js_ref/TouchList

  • 8/19/2019 Bab 5 Android

    20/60

    cancelable

    Menunjukkan apakah suatu kejadian dapat memiliki aksi default dicegah.Jika benar,

    tindakan default dapat dicegah, jika tidak, ia tidak bisa.

    view

    Tampilan (jendela DOM) di mana peristiwa itu terjadi.

    detail

    Menentukan beberapa informasi detail mengenai peristiwa tergantung pada jenis

    aktivitas.

    screenX

    X-koordinat adalah lokasi acara di layar koordinat.

    screenY

    Y-koordinat adalah lokasi acara di layar koordinat.

    clientX

    X-koordinat lokasi acara relatif terhadap jendela viewport tersebut.

    clientY

    Y-koordinat lokasi acara relatif terhadap jendela viewport tersebut.

    ctrlKey

    Jikabenar, tombol control berfungsi, jika tidak, tidak.

    altKey

    Jikabenar, tombol alt berfungsi ditekan, jika tidak, tidak.

  • 8/19/2019 Bab 5 Android

    21/60

    shiftKey

    Jikabenar, tombol shift berfungsi, jika tidak, tidak.

    metaKey

    Jikabenar,meta tombol ditekan, jika tidak, tidak.

    touches

    Koleksi Touch menyentuh benda-benda yang mewakili semua yang terkait dengan acara

    ini.

    targetTouches

    Koleksi Touch menyentuh benda-benda yang mewakili semua yang terkait dengan target

    ini.

    changedTouches

    A collection of Touch objects representing all touches that changed in this event. Koleksi

    Touch objek mewakili semua sentuhan yang berubah dalam acara ini.

    scale

    Jarak antara dua jari sejak awal peristiwa sebagai pengali dari jarak awal.Nilai awal

    adalah1.0.Jika kurang dari 1,0, sikap adalah sejumput dekat (untuk memperkecil). Jika

    yang lebih besar dari 1,0, sikap adalah sejumput terbuka (untuk memperbesar).

    rotation

    Rotasi delta sejak awal dari suatu peristiwa, dalam derajat, di mana positif dan searah

    jarum jam berlawanan arah jarum jam adalah negatif.

    Argumen untuk fungsi touchend.Script touchend mendapatkan informasi dari objek acara

    touchstart :

    http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchClassReference/Touch/Touch.html%23//apple_ref/javascript/cl/Touch#//apple_ref/javascript/cl/Touchhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchClassReference/Touch/Touch.html%23//apple_ref/javascript/cl/Touch#//apple_ref/javascript/cl/Touchhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchClassReference/Touch/Touch.html%23//apple_ref/javascript/cl/Touch#//apple_ref/javascript/cl/Touchhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchClassReference/Touch/Touch.html%23//apple_ref/javascript/cl/Touch#//apple_ref/javascript/cl/Touchhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchClassReference/Touch/Touch.html%23//apple_ref/javascript/cl/Touch#//apple_ref/javascript/cl/Touchhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchClassReference/Touch/Touch.html%23//apple_ref/javascript/cl/Touch#//apple_ref/javascript/cl/Touchhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchClassReference/Touch/Touch.html%23//apple_ref/javascript/cl/Touch#//apple_ref/javascript/cl/Touchhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.apple.com/safari/library/documentation/UserExperience/Reference/TouchClassReference/Touch/Touch.html%23//apple_ref/javascript/cl/Touch#//apple_ref/javascript/cl/Touch

  • 8/19/2019 Bab 5 Android

    22/60

    Dengan sentuhan satu objek

    Rupanya, menangani event touchend dengan informasi yang diperoleh dari objek acaratouchstart berfungsi dengan baik. Bisakah aku menulis ulang naskah sehinggahanya

    menggunakan objek acara touchstart, dan sepenuhnya mengabaikan dan touchend objek

    touchmove?

    Jawabannya ternyata Ya. Teks berikut bekerja dengan baik pada iPhone dan Android :

    var testEl = [the scrolling layer];

    testEl.ontouchstart = function ( e ) {// do stuffvar origin = getCoors(e);testEl.ontouchmove = moveDrag;testEl.ontouchend = function () {

  • 8/19/2019 Bab 5 Android

    23/60

    Event Listeners

    Event listener adalah sebuah antarmuka di kelas View yang berisi metode callback tunggal.

    Metode-metode ini akan dipanggil oleh kerangka kerja Android ketika pendengar Lihat untuk

    yang telah terdaftar dipicu oleh interaksi pengguna dengan item di UI.

    Termasuk dalam antarmuka pendengar acara adalah metode panggilan balik berikut :

    testEl.ontouchstart = function ( e ) {// do stuffvar origin = getCoors();testEl.ontouchmove = moveDrag;testEl.ontouchend = function () {

    var end = getCoors();// do stufftestEl.ontouchmove = testEl.ontouchend = null;

    setTimeout(checkOneLastTime,1000);}

    function moveDrag() {var currentPos = getCoors();// move layer

    }

    function getCoors() {

    // e refers to the touchstart event object// even if the getCoors function is called

    // ontouchmove or ontouchend. Works fine

    var coors;if ( e .touches) { // iPhone

    coors = e .touches[0].clientX;} else { // all others

    coors = e .clientX;}return coors;

    }

    function checkOneLastTime() {alert(getCoors()) // works! event object still there

    }}

  • 8/19/2019 Bab 5 Android

    24/60

    onClick()

    Dari View.OnClickListener.Ini disebut baik bila pengguna menyentuh item (bila dalam

    modus sentuh), atau berfokus pada item dengan-tombol navigasi atau trackball dan

    menekan cocok "masukkan" atau menekan tombol di atas trackball.

    onLongClick()

    Dari View.OnLongClickListener. Ini disebut bila pengguna menyentuh dan memegang

    salah satu item (bila dalam modus sentuh), atau berfokus pada item dengan-tombol

    navigasi atau trackball dan menekan dan memegang cocok "masukkan" kunci atau

    menekan dan memegang di atas trackball ( untuk satu kedua).

    onFocusChange()

    Dari View.OnFocusChangeListener. Ini dipanggil saat pengguna menavigasi ke atau

    jauh dari item, dengan menggunakan tombol navigasi atau trackball.

    onKey()

    Dari View.OnKeyListener. Ini dipanggil saat pengguna difokuskan pada item dan

    menekan tombol atau rilis pada perangkat.

    onTouch()

    Dari View.OnTouchListener. Ini disebut ketika pengguna melakukan suatu tindakan

    yang memenuhi syarat sebagai acara sentuhan, termasuk pers, merilis, atau gerakan

    gerakan di layar (dalam batas-batas item).

    onCreateContextMenu()

    http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnClickListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnLongClickListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnFocusChangeListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnKeyListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnTouchListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnTouchListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnKeyListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnFocusChangeListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnLongClickListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnClickListener.html

  • 8/19/2019 Bab 5 Android

    25/60

    Dari View.OnCreateContextMenuListener. Ini disebut ketika Menu Konteks sedang

    dibangun (sebagai hasil dari panjang "klik yang berkelanjutan"). Lihat pembahasan di

    menu kontek sMenciptakan Menuuntuk informasi lebih lanjut.

    Contoh di bawah ini menunjukkan cara bagaimana mendaftar pada pendengar untuk Button.

    Anda juga dapat merasa lebih nyaman untuk mengimplementasikan OnClickListener sebagai

    bagian dari Aktivitas Anda. Ini akan menghindari beban kelas ekstra dan alokasi objek. Sebagaicontoh :

    // Create an anonymous implementation of OnClickListenerprivate OnClickListener mCorkyListener = new OnClickListener() {

    public void onClick(View v) {// do something when the button is clicked

    }};

    protected void onCreate(Bundle savedValues) {...

    // Capture our button from layoutButton button = (Button)findViewById(R.id.corky);// Register the onClick listener with the implementation abovebutton.setOnClickListener(mCorkyListener);...

    }

    public class ExampleActivity extends Activity implementsOnClickListener {

    protected void onCreate(Bundle savedValues) {...Button button = (Button)findViewById(R.id.corky);button.setOnClickListener(this);

    }

    // Implement the OnClickListener callbackpublic void onClick(View v) {

    // do something when the button is clicked}...

    }

    http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnCreateContextMenuListener.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/guide/topics/ui/menus.html%23context-menu#context-menuhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/guide/topics/ui/menus.html%23context-menu#context-menuhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnCreateContextMenuListener.html

  • 8/19/2019 Bab 5 Android

    26/60

    Perhatikan bahwaonClick () panggilan balik dalam contoh di atas tidak memiliki nilai kembali,

    tetapi beberapa pendengar acara metode lain harus mengembalikan sebuah boolean. Alasannya

    tergantung pada acara tersebut. Untuk beberapa yang melakukannya, inilah alasannya :

    onLongClick()- ini mengembalikan boolean untuk menunjukkan apakah Anda telahdikonsumsi acara dan seharusnya tidak dilakukan lebih lanjut. Artinya, kembalibenar

    untuk menunjukkan bahwa Anda memiliki menangani acara dan harus berhenti di sini

    return false jika Anda belum ditangani dan / atau acara harus terus lain-klik pada

    pendengar.

    onKey()- ini mengembalikan boolean untuk menunjukkan apakah Anda telah dikonsumsi

    acara dan seharusnya tidak dilakukan lebih lanjut. Artinya, kembalibenar untuk

    menunjukkan bahwa Anda memiliki menangani acara dan harus berhenti di sini return false jika Anda belum ditangani dan / atau acara harus terus-tombol lainnya pada

    pendengar.

    onTouch()- ini mengembalikan boolean untuk menunjukkan apakah pendengar Anda

    mengkonsumsi acara ini. Yang penting adalah bahwa acara ini dapat memiliki beberapa

    tindakan yang mengikuti satu sama lain. Jadi, jika Anda kembali palsu saat acara aksi

    turun diterima, Anda menunjukkan bahwa Anda belum dikonsumsi acara tersebut dan

    juga tidak tertarik pada tindakan selanjutnya dari acara ini. Jadi, Anda tidak akan

    dipanggil untuk tindakan lainnya dalam acara, seperti isyarat jari, atau tindakan peristiwa

    sampai akhirnya.

    Event Handlers

    Jika Anda sedang membangun sebuah komponen khusus dari View, maka Anda akan dapat

    menentukan metode beberapa callback digunakan sebagai event handler default. Dalam

    dokumen di Custom Komponen Bangunan, Anda akan belajar melihat beberapa callback umum

    digunakan untuk penanganan event, termasuk:

    onKeyDown(int, KeyEvent)- Dipanggil ketika kunci baru terjadi peristiwa.

    onKeyUp(int, KeyEvent)- Dipanggil ketika kunci atas peristiwa terjadi.

    onTrackballEvent (MotionEvent)- Dipanggil ketika terjadi peristiwa gerakan trackball.

    http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnLongClickListener.html%23onLongClick%2528android.view.View%2529#onLongClick%28android.view.View%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnKeyListener.html%23onKey%2528android.view.View,%2520int,%2520android.view.KeyEvent%2529#onKey%28android.view.View,%20int,%20android.view.KeyEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnTouchListener.html%23onTouch%2528android.view.View,%2520android.view.MotionEvent%2529#onTouch%28android.view.View,%20android.view.MotionEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/guide/topics/ui/custom-components.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onKeyDown%2528int,%2520android.view.KeyEvent%2529#onKeyDown%28int,%20android.view.KeyEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onKeyUp%2528int,%2520android.view.KeyEvent%2529#onKeyUp%28int,%20android.view.KeyEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onTrackballEvent%2528android.view.MotionEvent%2529#onTrackballEvent%28android.view.MotionEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onTrackballEvent%2528android.view.MotionEvent%2529#onTrackballEvent%28android.view.MotionEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onKeyUp%2528int,%2520android.view.KeyEvent%2529#onKeyUp%28int,%20android.view.KeyEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onKeyDown%2528int,%2520android.view.KeyEvent%2529#onKeyDown%28int,%20android.view.KeyEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/guide/topics/ui/custom-components.htmlhttp://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnTouchListener.html%23onTouch%2528android.view.View,%2520android.view.MotionEvent%2529#onTouch%28android.view.View,%20android.view.MotionEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnKeyListener.html%23onKey%2528android.view.View,%2520int,%2520android.view.KeyEvent%2529#onKey%28android.view.View,%20int,%20android.view.KeyEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.OnLongClickListener.html%23onLongClick%2528android.view.View%2529#onLongClick%28android.view.View%29

  • 8/19/2019 Bab 5 Android

    27/60

    onTouchEvent (MotionEvent)- Dipanggil ketika layar sentuh acara gerak terjadi.

    onFocusChanged (boolean, int, rect)- Dipanggil ketika melihat keuntungan atau

    kehilangan fokus.

    Touch Mode

    Bila pengguna adalah menavigasi user interface dengan tombol arah atau trackball, maka perlu

    memberikan fokus untuk item ditindaklanjuti (seperti kancing) sehingga pengguna dapat melihat

    apa yang akan menerima input. Jika perangkat memiliki kemampuan sentuh, namun, dan

    pengguna mulai berinteraksi dengan antarmuka dengan menyentuhnya, maka tidak lagi

    diperlukan untuk menyorot item, atau memberikan fokus ke Lihat tertentu.Dengan demikian, ada

    modus untuk interaksi bernama "mode sentuh."

    Handling Focus

    Kerangka ini akan menangani fokus gerakan rutin dalam menanggapi input pengguna. Ini

    termasuk mengubah fokus sebagai Tampilan dihapus atau disembunyikan, atau sebagai

    Tampilan baru menjadi tersedia. Tampilan menunjukkan kesediaan mereka untuk mengambil

    fokus melalui isFocusable () metode. Untuk mengubah apakah Lihat dapat mengambil fokus,

    panggilansetFocusable (). Ketika dalam mode sentuh, Anda mungkin pertanyaan apakah Lihat

    memungkinkan fokus denganisFocusableInTouchMode (). Anda dapat mengubah ini

    dengansetFocusableInTouchMode ().

    Fokus gerakan didasarkan pada algoritma yang menemukan tetangga terdekat dalam arah

    tertentu. Dalam kasus yang jarang, algoritma default mungkin tidak cocok dengan perilaku

    dimaksudkan pengembang. Dalam situasi ini, Anda dapat memberikan menimpa eksplisit dengan

    XML berikut atribut dalam tata letak file:nextFocusDown, nextFocusLeft, nextFocusRight, dan

    nextFocusUp. Tambahkan salah satu atribut ke Lihatdari yang fokusnya adalah meninggalkan.

    Tentukan nilai dari atribut yang akan id dari Lihat yang fokus harus diberikan. Sebagai contoh:

    http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onTouchEvent%2528android.view.MotionEvent%2529#onTouchEvent%28android.view.MotionEvent%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onFocusChanged%2528boolean,%2520int,%2520android.graphics.Rect%2529#onFocusChanged%28boolean,%20int,%20android.graphics.Rect%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23isFocusable%2528%2529#isFocusable%28%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23setFocusable%2528boolean%2529#setFocusable%28boolean%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23isFocusableInTouchMode%2528%2529#isFocusableInTouchMode%28%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23setFocusableInTouchMode%2528boolean%2529#setFocusableInTouchMode%28boolean%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23setFocusableInTouchMode%2528boolean%2529#setFocusableInTouchMode%28boolean%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23isFocusableInTouchMode%2528%2529#isFocusableInTouchMode%28%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23setFocusable%2528boolean%2529#setFocusable%28boolean%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23isFocusable%2528%2529#isFocusable%28%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onFocusChanged%2528boolean,%2520int,%2520android.graphics.Rect%2529#onFocusChanged%28boolean,%20int,%20android.graphics.Rect%29http://translate.google.com/translate?hl=id&sl=en&tl=id&prev=_t&u=http://developer.android.com/reference/android/view/View.html%23onTouchEvent%2528android.view.MotionEvent%2529#onTouchEvent%28android.view.MotionEvent%29

  • 8/19/2019 Bab 5 Android

    28/60

    Biasanya, dalam tata letak vertikal, menavigasi dari Tombol pertama tidak akan ke mana-mana,

    tidak akan menavigasi turun dari Tombol kedua. Sekarang Tombol atas telah mendefinisikan

    satu dasar sebagainextFocusUp (dan sebaliknya), fokus navigasi akan siklus dari atas-ke-bawah

    dan bawah-ke-atas.

    Jika Anda ingin mendeklarasikan Lihat sebagai focusable di UI (saat itu secara tradisional tidak),tambahkan android: XML atribut focusable ke View, dalam deklarasi tata letak Anda. Anda juga

    dapat mendeklarasikan Lihat sebagai sementara focusable di Touch Mode dengan android:

    focusableInTouchMode.

  • 8/19/2019 Bab 5 Android

    29/60

    Touchscreens

    Banyak Android menggabungkan perangkat sentuh. Bila perangkat tidak memiliki keyboard

    fisik, banyak dari masukan pengguna harus datang melalui touchscreen. Oleh karena itu aplikasi

    Anda sering perlu untuk dapat menangani input sentuhan dari pengguna. Kau kemungkinan besar sudah melihat keyboard virtual yang menampilkan di layar ketika input teks diperlukan

    dari pengguna. Kami menggunakan sentuhan dengan pemetaan aplikasi di Bab 7 untuk memutar

    peta samping. Implementasi ini touchscreen antarmuka telah tersembunyi dari Anda sejauh ini,

    tapi sekarang kami akan menunjukkan cara untuk mengambil keuntungan dari touchscreen.

    Bab ini terdiri dari empat bagian utama. Bagian pertama akan membahas MotionEvent objek,

    yang menceritakan bagaimana Android aplikasi yang pengguna menyentuh touchscreen. Kami

    juga akan menutupi VelocityTracker dan drag dan drop. Yang kedua bagian akan menangani

    multi-sentuh, di mana pengguna dapat memiliki lebih dari satu jari sekaligus di touchscreen.

    Bagian ketiga meliputi menyentuh dengan peta, karena ada beberapa kelas khusus dan metode

    untuk membantu kami dengan peta dan sentuh. Akhirnya, kami akan termasuk bagian tentang

    gerak, jenis kemampuan khusus yang berhubungan urutan dapat ditafsirkan sebagai perintah.

    Understanding MotionEvents

    Dalam bagian ini kita akan mencakup bagaimana aplikasi Android menceritakan tentang

    peristiwa sentuhan dari pengguna. Untuk saat ini, kami hanya akan memperhatikan satu--jari pada waktu-a-menyentuh touchscreen. (Kita akan membahas multi-touch pada bagian

    selanjutnya.)

    Pada tingkat hardware, layar sentuh terbuat dari bahan khusus yang dapat mengambil tekanan

    dan mengkonversi koordinat yang ke layar. Informasi tentang sentuhan adalah berubah menjadi

    data, dan data yang akan diteruskan ke perangkat lunak untuk menghadapinya. Ketika pengguna

    menyentuh layar sentuh pada perangkat Android, sebuah objek MotionEvent adalah dibuat.

    MotionEvent berisi informasi tentang di mana dan kapan sentuhan mengambil tempat, sertarincian lain dari acara sentuhan. Objek MotionEvent mendapatkan diteruskan ke metode yang

    tepat dalam aplikasi Anda. Hal ini bisa menjadi onTouchEvent () metode View objek. Ingat

    bahwa kelas Lihat merupakan induk cukup beberapa kelas di Android, termasuk Layouts,

    Buttons, Daftar, Permukaan, Lonceng dan banyak lagi. Ini berarti kita dapat berinteraksi dengan

    semua jenis benda Lihat menggunakan peristiwa sentuh. Ketika metode ini disebut, itu dapat

  • 8/19/2019 Bab 5 Android

    30/60

    memeriksa MotionEvent objek untuk memutuskan apa yang harus dilakukan. Misalnya,

    MapView bisa menggunakan peristiwa sentuhan untuk memindahkan peta ke samping untuk

    memungkinkan pengguna untuk memutar peta untuk tempat menarik lainnya. Atau objek virtual

    keyboard dapat menerima acara sentuh untuk mengaktifkan tombol virtual untuk memberikan

    input teks ke beberapa bagian lain dari user interface (UI).

    Sebuah benda MotionEvent merupakan salah satu rangkaian peristiwa yang berkaitan dengan

    sentuhan dengan pengguna. Itu urutan dimulai bila pengguna menyentuh touchscreen pertama,

    terus melalui gerakan jari di atas permukaan touchscreen, dan berakhir ketika jari diangkat dari

    touchscreen. Sentuhan awal (tindakan ACTION_DOWN), yang gerakan menyamping (tindakan

    ACTION_MOVE) dan acara up (tindakan ACTION_UP) dari jari semua membuat objek

    MotionEvent. Untuk acara ACTION_MOVE, Anda dapat menerima cukup beberapa saat jari

    bergerak melintasi permukaan sebelum Anda menerima ACTION_UP akhir acara. Setiap objekMotionEvent berisi informasi tentang tindakan apa yang sedang dilakukan, di mana menyentuh

    berlangsung, berapa banyak tekanan diterapkan, seberapa besar menyentuh adalah, ketika aksi

    terjadi, dan ketika terjadi ACTION_DOWN awal.

    Ada tindakan yang mungkin keempat, yang ACTION_CANCEL. Tindakan ini digunakan untuk

    menunjukkan bahwa urutan sentuhan berakhir tanpa benar-benar melakukan apa-apa. Akhirnya,

    ada ACTION_OUTSIDE, yang diatur dalam kasus khusus di mana sentuhan terjadi di luar kita

    jendela tapi kami masih bisa untuk mencari tahu tentang hal itu.

    Ada cara lain untuk menerima peristiwa menyentuh, dan itu adalah untuk mendaftarkan

    penangan panggilan balik untuk acara menyentuh benda View. Kelas untuk menerima peristiwa

    harus melaksanakan View.OnTouchListener antarmuka, dan objek Lihat setOnTouchListener's ()

    metode harus dipanggil untuk setup Lihat handler untuk itu. Kelas pelaksanaan dari

    View.OnTouchListener harus melaksanakan onTouch () method. Sedangkan onTouchEvent ()

    metode mengambil hanya objek MotionEvent sebagai parameter, onTouch () mengambil

    keduanya sebuah Melihat dan objek MotionEvent sebagai parameter. Hal ini karenaOnTouchListener dapat menerima objek MotionEvent untuk dilihat beberapa. Ini akan menjadi

    aplikasi yang lebih jelas dengan contoh berikut ini kita. Jika MotionEvent handler (baik melalui

    onTouchEvent () atau onTouch () method) mengkonsumsi acara dan tidak ada orang lain perlu

    tahu tentang hal itu, metode ini harus kembali benar. Android ini mengatakan bahwa acara

    tersebut tidak perlu diberikan kepada setiap tampilan lain. Jika Lihat objek tidak tertarik dalam

  • 8/19/2019 Bab 5 Android

    31/60

    kegiatan maupun peristiwa-peristiwa masa depan berhubungan dengan sentuhan ini urutan, ia

    mengembalikan palsu. The onTouchEvent () method dari kelas dasar Lihat tidak melakukan apa-

    apa dan kembali palsu. Subclass dari Lihat mungkin atau mungkin tidak melakukan hal yang

    sama. Misalnya, sebuah objek Tombol akan mengkonsumsi acara sentuhan karena sentuhan

    adalah setara dengan klik, dan karena itu benar dari onTouchEvent () metode kembali. Setelah

    menerima acara ACTION_DOWN, Tombol akan berubah warna untuk menunjukkan bahwa

    dalam proses diklik, dan Button juga ingin menerima event ACTION_UP untuk mengetahui

    kapan pengguna telah melepaskannya sehingga dapat memulai logika mengklik tombol. Jika

    Tombol objek kembali palsu dari onTouchEvent (), tidak akan menerima lebih objek

    MotionEvent untuk menceritakannya ketika pengguna mengangkat jari mereka dari touchscreen.

    Ketika kita ingin event sentuh untuk melakukan sesuatu yang baru dengan objek Lihat tertentu,

    kita dapat memperpanjang kelas, menimpa onTouchEvent () metode, dan menempatkan logika

    kita di sana. Kita bisa juga mengimplementasikan antarmuka View.OnTouchListener dan

    mendirikan penangan panggilan balik pada Lihat objek. Dengan menetapkan sebuah handler

    callback dengan onTouch (), akan MotionEvents disampaikan lebih dulu sebelum mereka pergi

    ke onTouchEvent View's () method. Hanya jika onTouch () metode kembali palsu akan kami

    onTouchEvent Lihat's () method dipanggil.

    Mari kita ke aplikasi contoh kita di mana ini harus lebih mudah untuk melihat.

    XM L L ayout Fi le for TouchDemo1

  • 8/19/2019 Bab 5 Android

    32/60

    android:tag="trueLayoutTop"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:layout_weight="1"

    >

  • 8/19/2019 Bab 5 Android

    33/60

    android:layout_weight="1"

    android:background="#FF00FF"

    >

    Beberapa hal yang menunjukkan tentang tata letak ini. Kami telah didirikan tag pada kami UI

    objek. Kita akan bisa lihat tag dalam kode kita sebagai peristiwa terjadi pada mereka. Kami telah

    juga digunakan RelativeLayouts ke posisi objek kami. Juga perhatikan bagaimana kita telahmenggunakan kustom objek (TrueButton dan FalseButton). Anda akan melihat dalam kode Java

    bahwa ini adalah kelas diperpanjang dari kelas Button. Gambar 16-1 menunjukkan bagaimana

    tata letak ini terlihat seperti danKode 16-2 menunjukkan kode tombol Java kami.

  • 8/19/2019 Bab 5 Android

    34/60

    Java Code for the Bu tton Classes for TouchD emo1

    import android.content.Context;

    import android.util.AttributeSet;

    import android.util.Log;

    import android.view.MotionEvent;

    import android.widget.Button;

    public abstract class BooleanButton extends Button {

    protected boolean myValue() {

    return false; CHAPTER 16: Touchscreens 595

    }

    public BooleanButton(Context context, AttributeSet attrs) {

    super(context, attrs);

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    String myTag = this.getTag().toString();

    Log.v(myTag, "-----------------------------------");

    Log.v(myTag, MainActivity.describeEvent(this, event));

    Log.v(myTag, "super onTouchEvent() returns " +

    super.onTouchEvent(event));

    Log.v(myTag, "and I'm returning " + myValue());

  • 8/19/2019 Bab 5 Android

    35/60

    event.recycle();

    return(myValue());

    }

    }

    // This file is TrueButton.java

    import android.content.Context;

    import android.util.AttributeSet;

    public class TrueButton extends BooleanButton {

    protected boolean myValue() {

    return true;

    }

    public TrueButton(Context context, AttributeSet attrs) {

    super(context, attrs);

    }

    }

    // This file is FalseButton.java

    import android.content.Context;

    import android.util.AttributeSet;

    public class FalseButton extends BooleanButton {

    public FalseButton(Context context, AttributeSet attrs) {

  • 8/19/2019 Bab 5 Android

    36/60

    super(context, attrs);

    }

    }

    Class BooleanButton dibangun sehingga kami bisa menggunakan kembali onTouchEvent ()

    metode, yang kami telah disesuaikan dengan menambahkan logging. Lalu kami membuat

    TrueButton dan FalseButton, yang akan merespon berbeda terhadap MotionEvents melewati

    mereka.

    // This file is MainActivity.java

    import android.app.Activity;

    import android.os.Bundle;

    import android.util.Log;

    import android.view.MotionEvent;

    import android.view.View; CHAPTER 16: Touchscreens 596

    import android.view.View.OnTouchListener;

    import android.widget.Button;

    import android.widget.RelativeLayout;

    public class MainActivity extends Activity implements OnTouchListener

    {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

  • 8/19/2019 Bab 5 Android

    37/60

    RelativeLayout layout1 = (RelativeLayout)

    findViewById(R.id.layout1);

    layout1.setOnTouchListener(this);

    Button trueBtn1 = (Button)findViewById(R.id.trueBtn1);

    trueBtn1.setOnTouchListener(this);

    Button falseBtn1 = (Button)findViewById(R.id.falseBtn1);

    falseBtn1.setOnTouchListener(this);

    RelativeLayout layout2 = (RelativeLayout)

    findViewById(R.id.layout2);

    layout2.setOnTouchListener(this);

    Button trueBtn2 = (Button)findViewById(R.id.trueBtn2);

    trueBtn2.setOnTouchListener(this);

    Button falseBtn2 = (Button)findViewById(R.id.falseBtn2);

    falseBtn2.setOnTouchListener(this);

    }

    @Override

    public boolean onTouch(View v, MotionEvent event) {

    String myTag = v.getTag().toString();

    Log.v(myTag, "-----------------------------");

    Log.v(myTag, "Got view " + myTag + " in onTouch");

  • 8/19/2019 Bab 5 Android

    38/60

    Log.v(myTag, describeEvent(v, event));

    if( "true".equals(myTag.substring(0, 4))) {

    Log.v(myTag, "and I'm returning true");

    return true;

    }

    else {

    Log.v(myTag, "and I'm returning false");

    return false;

    }

    }

    protected static String describeEvent(View view, MotionEvent

    event) {

    StringBuilder result = new StringBuilder(300);

    result.append("Action:

    ").append(event.getAction()).append("\n");

    result.append("Location: ").append(event.getX()).append(" x ")

    .append(event.getY()).append("\n");

    if( event.getX() < 0 || event.getX() > view.getWidth() ||

    event.getY() < 0 || event.getY() > view.getHeight()) {

    result.append(">>> Touch has left the view

  • 8/19/2019 Bab 5 Android

    39/60

    result.append("Pressure:

    ").append(event.getPressure()).append(" ");

    result.append("Size: ").append(event.getSize()).append("\n");

    result.append("Down time:").append(event.getDownTime()).append("ms\n");

    result.append("Event time:

    ").append(event.getEventTime()).append("ms");

    result.append(" Elapsed: ").append(event.getEventTime()-

    event.getDownTime());

    result.append(" ms\n");

    return result.toString();

    }

    }

    Contoh pesan LogCat Messages dari TouchDemo1 yang berasal dari Emulator

    trueBtnTop -----------------------------

    trueBtnTop Got view trueBtnTop in onTouch

    trueBtnTop Action: 0

    trueBtnTop Location: 52.0 x 20.0

    trueBtnTop Edge flags: 0

    trueBtnTop Pressure: 0.0 Size: 0.0

    trueBtnTop Down time: 163669ms

    trueBtnTop Event time: 163669ms Elapsed: 0 ms

    trueBtnTop and I'm returning true

    trueBtnTop -----------------------------

  • 8/19/2019 Bab 5 Android

    40/60

    trueBtnTop Got view trueBtnTop in onTouch

    trueBtnTop Action: 1

    trueBtnTop Location: 52.0 x 20.0

    trueBtnTop Edge flags: 0

    trueBtnTop Pressure: 0.0 Size: 0.0

    trueBtnTop Down time: 163669ms

    trueBtnTop Event time: 163831ms Elapsed: 162 ms

    trueBtnTop and I'm returning true

    Listing 16 – 5. Sample LogCat Messages from TouchDemo1 from a Real Device

    trueBtnTop -----------------------------

    trueBtnTop Got view trueBtnTop in onTouch

    trueBtnTop Action: 0

    trueBtnTop Location: 42.8374 x 25.293747

    trueBtnTop Edge flags: 0

    trueBtnTop Pressure: 0.05490196 Size: 0.2 CHAPTER 16:

    Touchscreens 598

    trueBtnTop Down time: 24959412ms

    trueBtnTop Event time: 24959412ms Elapsed: 0 ms

    trueBtnTop and I'm returning true

    trueBtnTop -----------------------------

    trueBtnTop Got view trueBtnTop in onTouch

    trueBtnTop Action: 2

    trueBtnTop Location: 42.8374 x 25.293747

  • 8/19/2019 Bab 5 Android

    41/60

    trueBtnTop Edge flags: 0

    trueBtnTop Pressure: 0.05490196 Size: 0.2

    trueBtnTop Down time: 24959412ms

    trueBtnTop Event time: 24959530ms Elapsed: 118 ms

    trueBtnTop and I'm returning true

    trueBtnTop -----------------------------

    trueBtnTop Got view trueBtnTop in onTouch

    trueBtnTop Action: 1

    trueBtnTop Location: 42.8374 x 25.293747

    trueBtnTop Edge flags: 0

    trueBtnTop Pressure: 0.05490196 Size: 0.2

    trueBtnTop Down time: 24959412ms

    trueBtnTop Event time: 24959567ms Elapsed: 155 ms

    trueBtnTop and I'm returning true

    Peristiwa pertama memiliki tindakan yang ACTION_DOWN 0. Acara terakhir memiliki

    tindakan dari 1

    yang ACTION_UP. Jika menggunakan perangkat nyata Anda mungkin melihat lebih dari dua

    peristiwa. Apa pun

    peristiwa di antara ACTION_DOWN dan ACTION_UP kemungkinan besar akan memiliki

    tindakan 2 yangadalah ACTION_MOVE. Kemungkinan lain adalah tindakan yang ACTION_CANCEL 3 dan 4

    yang ACTION_OUTSIDE. Ketika menggunakan real jari pada layar sentuh nyata Anda tidak

    dapat

    selalu menyentuh dan lepaskan tanpa gerakan kecil di permukaan, sehingga beberapa

  • 8/19/2019 Bab 5 Android

    42/60

    ACTION_MOVE peristiwa tidak terduga.

    Ada beberapa perbedaan lain antara emulator dan perangkat nyata. Perhatikan bahwa

    ketepatan lokasi dalam emulator ini adalah untuk bilangan bulat (52 20), sedangkan

    pada perangkat yang sebenarnya Anda melihat pecahan (42,8374 oleh 25,293747). Lokasi untuk

    MotionEvent memiliki komponen X dan Y, dimana X merupakan jarak dari kiri-

    tangan sisi objek Lihat ke titik menyentuh, dan Y merupakan jarak dari

    bagian atas obyek Lihat untuk titik menyentuh.

    Anda juga akan melihat bahwa tekanan di emulator adalah nol, seperti ukuran. Untuk nyata

    perangkat, tekanan mewakili betapa sulitnya menekan jari, dan ukuran merupakan

    seberapa besar menyentuh adalah. Jika Anda menyentuh ringan dengan ujung jari kelingkingnya

    Anda nilai untuk

    tekanan dan ukuran akan menjadi kecil. Jika Anda menekan keras dengan jempol kedua tekanan

    dan

    akan ukuran yang lebih besar. dokumentasi mengatakan bahwa nilai tekanan dan ukuran akan

    antara 0 dan 1. Namun, karena perbedaan di hardware, mungkin akan sangat sulit untuk

    menggunakan

    mutlak setiap nomor dalam aplikasi Anda untuk membuat keputusan tentang tekanan dan

    ukuran.

    Ini akan baik-baik untuk membandingkan tekanan dan ukuran antara MotionEvents yang terjadidalam

    aplikasi Anda, tetapi Anda mungkin akan mengalami kesulitan jika Anda memutuskan bahwa

    tekanan harus melebihi

    seperti nilai 0,8 untuk dianggap sebagai tekan keras. Pada perangkat tertentu Anda mungkin

    tidak pernah mendapatkan nilai diatas 0,8. Anda bahkan mungkin tidak mendapatkan nilai di atas

    0,2.

    Waktu turun dan nilai-nilai peristiwa waktu beroperasi dengan cara yang sama antara emulator

    dan perangkat yang nyata, satu-satunya perbedaan bahwa perangkat yang sebenarnya memiliki

    nilai lebih besar.

    Berlalu waktu kerja sama.

    Tepi bendera adalah untuk mendeteksi ketika menyentuh telah mencapai tepi fisik

  • 8/19/2019 Bab 5 Android

    43/60

    layar. Dokumentasi Android SDK mengatakan bahwa bendera ditetapkan untuk menunjukkan

    bahwa

    sentuh telah berpotongan dengan tepi layar (atas, bawah, kiri atau kanan). Namun,

    yang getEdgeFlags () metode selalu dapat kembali nol, tergantung pada apa atau perangkat

    emulator itu digunakan di. Dengan perangkat keras, terlalu sulit untuk benar-benar mendeteksi

    sentuhan di

    tepi layar, sehingga Android seharusnya pin lokasi dengan pinggir gambar dan mengatur

    tepi bendera yang tepat untuk Anda. Ini tidak selalu terjadi, jadi sebaiknya Anda tidak

    mengandalkan pada

    tepi bendera yang ditetapkan dengan benar. Kelas MotionEvent menyediakan setEdgeFlags ()

    metode sehingga Anda dapat mengatur flag diri sendiri jika Anda ingin.

    Hal terakhir yang melihat adalah bahwa kami akan mengembalikan onTouch metode () benarkarena kami

    TrueButton dikodekan untuk kembali benar. Kembali benar mengatakan bahwa MotionEvent

    Android

    objek telah dikonsumsi dan tidak ada alasan untuk memberikannya kepada orang lain. Ia juga

    memberitahu

    Android untuk tetap mengirimkan peristiwa sentuhan dari urutan ini sentuh untuk metode ini. Itu

    mengapa kita punya acara ACTION_UP, serta acara ACTION_MOVE dalam kasus yang nyata

    perangkat.

    Sekarang menyentuh "kembali palsu" tombol di dekat bagian atas layar. Untuk sisa

    bagian ini kami akan menampilkan output LogCat sampel hanya dari perangkat nyata. Perbedaan

    telah dijelaskan, jadi jika Anda bekerja dengan emulator Anda harus memahami

    mengapa Anda melihat apa yang Anda lihat. Kode 16-6 menunjukkan LogCat sampel output

    untuk

    "Anda kembali palsu" sentuh.

    Sample LogCat from Touching the Top “returns false” Button

    falseBtnTop -----------------------------

    falseBtnTop Got view falseBtnTop in onTouch

    falseBtnTop Action: 0

  • 8/19/2019 Bab 5 Android

    44/60

  • 8/19/2019 Bab 5 Android

    45/60

  • 8/19/2019 Bab 5 Android

    46/60

    itu, partway Äôs melalui

    ditekan. Itulah, sepertinya tombol terlihat ketika telah ditekan namun belum

    telah dirilis. Metode kustom kami kembali palsu bukan benar. Karena kita lagi

    Android mengatakan bahwa kami tidak mengkonsumsi acara ini, dengan mengembalikan palsu,

    Android pernah

    mengirimkan event ACTION_UP tombol kita sehingga kita tidak jadi tombol, t tahu bahwa jari

    pernah

    mengangkat dari touchscreen. Oleh karena itu, tombol kita masih dalam keadaan ditekan. Jika

    kita telah

    kembali benar seperti orangtua kita mau, kita akhirnya akan menerima

    ACTION_UP acara sehingga kami bisa mengubah warna kembali ke warna yang normal tombol.

    Untukrekap, setiap kali kita kembali palsu dari UI untuk objek benda MotionEvent diterima,Android

    akan berhenti mengirim objek ke objek MotionEvent UI, dan Android terus mencari

    UI objek lain untuk mengkonsumsi obyek MotionEvent kami.

    Anda mungkin telah menyadari bahwa ketika kita menyentuh "kita mengembalikan nilai true"

    tombol, kami tidak mendapatkan

    perubahan warna tombol. Mengapa demikian? Yah, karena onTouch () dipanggil sebelum

    tombol metode dipanggil, dan karena onTouch () kembali benar, Android pernahrepot-repot untuk memanggil "mengembalikan nilai true" tombol's onTouchEvent () method.

    Jika Anda menambahkan

    v.onTouchEvent (event); line ke onTouch () metode sebelum kembali benar, Anda w

    melihat perubahan warna tombol. Anda juga akan melihat baris log lebih di LogCat sejak kami

    onTouchEvent () metode juga menulis informasi ke LogCat.

    Mari kita terus melalui output LogCat. Sekarang bahwa Android telah mencoba dua kali untuk

    mencari

    konsumen untuk acara ACTION_DOWN dan gagal, ia pergi ke applicatio Lihat berikutnya yang

    yang mungkin bisa menerima peristiwa, yang dalam kasus kita adalah tata letak di bawah

    tombol. Kami disebut trueLayoutTop layout atas kita dan kita dapat melihat bahwa menerima

    ACTION_DOWN acara.

    Perhatikan bahwa onTouch kami () method dipanggil kembali, meskipun sekarang dengan

  • 8/19/2019 Bab 5 Android

    47/60

    tampilan tata letak

    dan bukan tampilan tombol. Segala sesuatu tentang MotionEvent objek diteruskan ke onTouch ()

    untuk trueLayoutTop adalah sama seperti sebelumnya, termasuk kali, kecuali untuk koordinat Y

    lokasi. Y koordinat berubah dari 44.281494 untuk tombol untuk 116.281494

    untuk tata letak. Hal ini masuk akal karena tombol tidak di sudut kiri atas

    tata letak, itu di bawah "mengembalikan nilai true" tombol. Oleh karena itu, Y koordinat

    menyentuh

    relatif terhadap tata letak yang lebih besar dari Y koordinat sentuhan yang sama relatif terhadap

    tombol; menyentuh lebih jauh dari ujung atas tata letak daripada dari atas

    tepi tombol. Karena onTouch () untuk kembali trueLayoutTop benar, Android

    mengirimkan sisa dari peristiwa menyentuh dengan layout dan kita melihat catatan log

    sesuai dengan ACTION_MOVE dan peristiwa ACTION_UP. Silakan dan menyentuhatas "kembali salah" lagi tombol dan perhatikan bahwa himpunan catatan log yang sama terjadi.

    Tha

    adalah, onTouch () dipanggil untuk falseBtnTop, onTouchEvent () dipanggil untuk falseBtnTop,

    kemudian onTouch () dipanggil untuk trueLayoutTop untuk sisa peristiwa. Android hanya

    menghentikan

    mengirimkan peristiwa tombol untuk satu urutan sentuhan pada satu waktu. Untuk urutan baru

    peristiwa sentuhan, Android akan kirim ke tombol lain kecuali mendapatkan pengembalian palsu

    dari metode yang disebut, yang masih tidak dalam aplikasi sampel kami.

    Sekarang sentuhan jari Anda di atas tapi tidak tata letak tombol baik, kemudian tarik jari Anda

    sekitar sedikit dan angkat dari touchscreen. (Jika Anda menggunakan emulator tersebut, cukup

    gunakan Anda

    mouse untuk melakukan gerakan serupa) Perhatikan aliran pesan log dalam LogCat. mana yang

    pertama

    catatan memiliki tindakan ACTION_DOWN, dan kemudian ada banyak peristiwa

    ACTION_MOVE

    diikuti oleh sebuah peristiwa ACTION_UP.

    Sekarang menyentuh "kembali atas benar" tombol, tapi sebelum lift off tombol, tarik Anda

  • 8/19/2019 Bab 5 Android

    48/60

    jari di layar, lalu angkat jari Anda dari layar. Kode 16-7 menunjukkan beberapa

    baru informasi dalam LogCat.

    LogCat Records Showing a Touch Outside of Our View

    [ … log messages of an ACTION_DOWN event followed by some

    ACTION_MOVE events … ]

    trueBtnTop Got view trueBtnTop in onTouch

    trueBtnTop Action: 2

    trueBtnTop Location: 150.41768 x 22.628128

    trueBtnTop >>> Touch has left the view

  • 8/19/2019 Bab 5 Android

    49/60

    terkait dengan tombol peristiwa. Catatan pertama di properti 16-7 menunjukkan catatan peristiwa

    di mana kita tidak lagi pada tombol. Dalam hal ini, X koordinat acara sentuh

    di sebelah kanan tepi tombol objek kami. Tapi kami terus menerima disebut dengan

    MotionEvent objek sampai kita mendapatkan event ACTION_UP. Ini karena kita terus

    benar kembali dari onTouch () method. Bahkan ketika kita akhirnya mengangkat jari kita off

    touchscreen, dan bahkan jika jari kita tidak pada tombol, onTouch kami () metode masih

    mendapatkan

    dipanggil untuk memberikan kita acara ACTION_UP karena kita selalu kembali benar. Ini

    adalah sesuatu

    yang harus diingat ketika berhadapan dengan MotionEvents. Ketika jari tersebut telah pindah off

    dari

    melihat, kita bisa memutuskan untuk membatalkan operasi apa saja yang telah dilakukan, dan palsu dari onTouch () metode sehingga kita tidak diberitahukan lebih lanjut kejadian kembali.

    Atau kita

    bisa memilih untuk terus menerima peristiwa (dengan kembali benar dari onTouch ()

    metode) dan hanya melakukan logika jika kembali jari untuk melihat kami sebelum lift off.

    Urutan sentuhan peristiwa harus dikaitkan ke atas kita "mengembalikan nilai true" tombol saat

    kita

    kembali benar dari onTouch (). Android ini mengatakan bahwa hal itu bisa berhenti mencari

    benda

    untuk menerima objek MotionEvent, dan hanya mengirim semua benda ini MotionEvent masa

    depan

    urutan menyentuh kepada kami. Bahkan jika kita menemukan lain melihat ketika menyeret jari

    kami,

    kita masih terikat pada tampilan asli untuk urutan ini.

    Mari kita lihat apa yang terjadi dengan bagian bawah dari aplikasi kita. Silakan dan menyentuh"Mengembalikan nilai true" tombol di bawah setengah. Kita melihat hal yang sama seperti yang

    terjadi dengan

    atas "mengembalikan nilai true" tombol. Karena onTouch () mengembalikan nilai true, Android

    mengirimkan kami sisa

    peristiwa-peristiwa dalam urutan menyentuh sampai jari diangkat dari touchscreen. Sekarang

  • 8/19/2019 Bab 5 Android

    50/60

    menyentuh bagian bawah "kembali palsu" tombol. Sekali lagi, onTouch () mengembalikan

    metode

    palsu dan onTouchEvent dengan () metode kembali palsu (baik yang terkait dengan

    falseBtnBottom melihat objek). Tapi kali ini, tampilan berikutnya untuk menerima MotionEvent

    yang

    objek adalah objek falseLayoutBottom, dan juga kembali palsu. Sekarang kami sudah selesai.

    Karena itu onTouchEvent () metode yang disebut super's onTouchEvent () metode, yang

    tombol yang berubah warna untuk menunjukkan itu setengah-tengah ditekan. Tetapi sekali lagi,

    tombol akan tetap cara ini karena kita tidak pernah mendapatkan peristiwa ACTION_UP

    berhubungan urutan ini, karena metode kami kembali palsu sepanjang waktu. Tidak seperti

    sebelumnya, bahkan tata letak tidak tertarik pada acara ini. Jika Anda menyentuh bagian bawah

    "kembali salah" tombol dan terus ke bawah, kemudian tarik jari Anda di sekitar layar, Anda tidakakan melihatada catatan lebih LogCat karena kita tidak mendapatkan benda MotionEvent lebih

    dikirim ke

    kita.

    Kami selalu kembali Android adalah palsu sehingga tidak akan mengganggu kita dengan lebih

    banyak acarauntuk urutan sentuhan. Sekali lagi, jika kita memulai urutan sentuhan baru, kita

    dapat melihat baru LogCat catatan muncul. Jika Anda melakukan sentuhan urutan bawah dalam

    tata letak dan tidak

    pada tombol, Anda akan melihat satu kejadian di LogCat untuk falseLayoutBottom yang

    mengembalikan

    maka tidak ada yang palsu dan setelah itu (sampai Anda mulai urutan sentuhan baru).

    Sejauh ini, kita telah menggunakan tombol untuk menunjukkan efek dari peristiwa MotionEvent

    dari

    sentuh. It's worth menunjukkan bahwa biasanya Anda akan menerapkan logika pada

    tombol menggunakan onClick () method. Kami menggunakan tombol untuk sampel aplikasi ini

    karena mereka mudah untuk menciptakan dan karena mereka adalah subclass dari Melihat dan

    oleh karena itu dapat menerima peristiwa menyentuh seperti pandangan lain. Ingat bahwa teknik

    ini

    berlaku untuk setiap obyek Lihat di aplikasi Anda, baik itu kelas tampilan standar atau

  • 8/19/2019 Bab 5 Android

    51/60

  • 8/19/2019 Bab 5 Android

    52/60

    VelocityTracker apa waktu digunakan, dan sebelum Anda dapat memanggil kedua rajin dan giat

    metode, Anda perlu memanggil computeCurrentVelocity yang VelocityTracker's (int

    unit) metode. Nilai unit merupakan berapa milidetik dalam waktu

    jangka waktu untuk mengukur kecepatan. Jika Anda ingin pixel per milidetik, menggunakan

    nilai unit

    1, jika Anda ingin piksel per detik, menggunakan nilai unit 1000. Nilai dikembalikan oleh

    getXVelocity () dan getYVelocity () metode akan positif jika kecepatan adalah ke arah kanan

    (untuk X) atau bawah (untuk Y). Nilai kembali akan negatif jika kecepatan adalah ke kiri (untuk

    X) atau naik (untuk Y).

    Ketika Anda selesai dengan objek VelocityTracker Anda punya dengan memperoleh () metode,

    panggilan VelocityTracker benda daur ulang () method. Kode 16-8 menunjukkan sampel

    onTouchEvent () handler untuk melihat.

    Listing 16 – 8. Sample Handler That Uses VelocityTracker

    private VelocityTracker vTracker = null;

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    int action = event.getAction();

    switch(action) {

    case MotionEvent.ACTION_DOWN:

    if(vTracker == null) {

    vTracker = VelocityTracker.obtain();

    }

    else {

    vTracker.clear();

  • 8/19/2019 Bab 5 Android

    53/60

    }

    vTracker.addMovement(event);

    break;

    case MotionEvent.ACTION_MOVE:

    vTracker.addMovement(event);

    vTracker.computeCurrentVelocity(1000);

    Log.v(TAG, "X velocity is " + vTracker.getXVelocity()

    +

    " pixels per second");

    Log.v(TAG, "Y velocity is " + vTracker.getYVelocity()

    +

    " pixels per second");

    break;

    case MotionEvent.ACTION_UP:

    case MotionEvent.ACTION_CANCEL:

    vTracker.recycle();

    break;

    }

    event.recycle();

    return true;

    }

    Beberapa catatan tentang VelocityTracker. Jelas ketika Anda hanya menambahkan satu

    MotionEvent ke VelocityTracker (yaitu, peristiwa ACTION_DOWN) kecepatan tidak dapat

    dihitung sebagai sesuatu yang lain dari nol. Tapi kita perlu menambahkan titik awal sehingga

  • 8/19/2019 Bab 5 Android

    54/60

    peristiwa ACTION_MOVE berikutnya dapat menghitung kecepatan lalu. Ternyata bahwa

    kecepatan dilaporkan setelah ACTION_UP akan ditambahkan ke VelocityTracker kami juga nol.

    Oleh karena itu, jangan membaca kecepatan X dan Y setelah menambahkan ACTION_UP

    mengharapkan untuk mendapatkan

    gerak. Jika Anda menulis sebuah aplikasi game di mana pengguna adalah membuang benda pada

    layar, gunakan kecepatan setelah menambahkan acara ACTION_MOVE terakhir untuk

    menghitung

    lintasan benda di tampilan permainan. VelocityTracker agak mahal dalam hal

    kinerja jadi gunakan hemat. Juga, pastikan bahwa Anda daur ulang itu segera setelah Anda

    dilakukan dengan hal itu jika orang lain ingin menggunakannya. Ada dapat lebih dari satu

    VelocityTracker digunakan di Android, tetapi mereka dapat mengambil banyak memori,

    sehingga memberikan Andakembali jika Anda tidak akan terus menggunakannya. Dalam properti 16-8, kami juga

    menggunakan jelas ()

    metode kalau kita memulai urutan sentuhan baru (misalnya, jika kita mendapatkan event

    ACTION_DOWN dan

    kami objek VelocityTracker sudah ada) bukan daur ulang ini dan mendapatkan

    baru satu.

    Menjelajahi Drag dan Drop

    Sekarang kita telah melihat bagaimana menerima objek MotionEvent dalam kode, mari

    kita lakukan sesuatumenarik dengan mereka. Kami akan menjelaskan bagaimana menerapkan

    drag dan drop. Untuk memulai,mari kita lakukan menyeret beberapa. Dalam aplikasi ini sampel

    berikutnya, kami akan mengambil titik putihdan tarik ke lokasi baru di layout kita. Menggunakan properti 16-9, menciptakan Android baruproyek dan pengaturan tata letak file XML seperti yang

    ditunjukkan, dan menambahkan kelas baru yang disebut Dot menggunakankode Java. Perhatikan

    bahwa nama paket dalam tata letak file XML untuk unsur Dotharus sesuai dengan nama paket

    yang Anda gunakan untuk aplikasi Anda. Perlu diketahui juga bahwa kami dapat

  • 8/19/2019 Bab 5 Android

    55/60

    meninggalkanAktivitas kelas utama saja karena baik adanya. UI untuk aplikasi ini ditunjukkan

    padaGambar 16-2.

    Sample Layout XML and Java Code for Our Drag Example

    import android.content.Context;

  • 8/19/2019 Bab 5 Android

    56/60

    import android.graphics.Canvas;

    import android.graphics.Color;

    import android.graphics.Paint;

    import android.util.AttributeSet;

    import android.view.MotionEvent;

    import android.view.View;

    public class Dot extends View {

    private static final float RADIUS = 20;

    private float x = 30;

    private float y = 30;

    private float initialX;

    private float initialY;

    private float offsetX;

    private float offsetY;

    private Paint backgroundPaint;

    private Paint myPaint;

    CHAPTER 16: Touchscreens 606

    public Dot(Context context, AttributeSet attrs) {

    super(context, attrs);

    backgroundPaint = new Paint();

    backgroundPaint.setColor(Color.BLUE);

  • 8/19/2019 Bab 5 Android

    57/60

    myPaint = new Paint();

    myPaint.setColor(Color.WHITE);

    myPaint.setAntiAlias(true);

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    int action = event.getAction();

    switch(action) {

    case MotionEvent.ACTION_DOWN:

    // Need to remember where the initial starting point

    // center is of our Dot and where our touch starts

    from

    initialX = x;

    initialY = y;

    offsetX = event.getX();

    offsetY = event.getY();

    break;

    case MotionEvent.ACTION_MOVE:

    case MotionEvent.ACTION_UP:

    case MotionEvent.ACTION_CANCEL:

    x = initialX + event.getX() - offsetX;

  • 8/19/2019 Bab 5 Android

    58/60

    y = initialY + event.getY() - offsetY;

    break;

    }

    event.recycle();

    return(true);

    }

    @Override

    public void draw(Canvas canvas) {

    int width = canvas.getWidth();

    int height = canvas.getHeight();

    canvas.drawRect(0, 0, width, height, backgroundPaint);

    canvas.drawCircle(x, y, RADIUS, myPaint);

    invalidate();

    }

    }

    Ketika Anda menjalankan aplikasi ini, Anda akan melihat sebuah titik putih di latar belakang

    biru. Anda dapatmenyentuh titik kemudian drag di sekitar layar. Bila Anda lift off, titik tetap di

    mana itusampai Anda menyentuhnya lagi dan tarik di tempat lain. Kami, benar-benar Äôve

    menyederhanakan ini untuk menunjukkanAnda hanya dasar-dasar cara untuk memindahkan

    objek di layar. Yang menarik () metode menempatkantitik pada lokasi saat ini dari X dan Y.

    Dengan menerima objek MotionEvent dalamonTouchEvent () metode, kita dapat memodifikasi

    nilai X dan Y oleh gerakan kita

  • 8/19/2019 Bab 5 Android

    59/60

    sentuh. Kami merekam posisi awal dari titik pada metode ACTION_DOWN, serta

    lokasi mulai sentuh. Karena kami don, t selalu menyentuh objek di tengah,menyentuh koordinat

    tidak akan sama dengan lokasi koordinat objek.Juga, jika objek kita, titik acuan Äôs bukanlah

    pusat tetapi sudut kiri atas, kita haruspastikan bahwa account kita ke dalam juga. Ketika jari kita

    mulai bergerak di ataslayar, kami menyesuaikan lokasi objek oleh delta di x dan y berdasarkan

    MotionEvents yang kita dapatkan.

    Ketika kita berhenti bergerak (misalnya, ACTION_UP), kami menyelesaikan kamilokasi

    menggunakan koordinat terakhir dari sentuhan kami. Kami, Äôre melakukan kecurangan kecil di

    sinikarena kita Dot melihat diposisikan pada layar relatif terhadap (0,0). Itu berarti bahwa

    kitahanya dapat membuat lingkaran relatif terhadap (0,0) sebagai lawan ke beberapa titik

    referensi lainnya. Jikaobjek kita tidak pada posisi relatif terhadap (0,0) kita mungkin perlu

    menyediakan offset tambahanuntuk lokasi objek kami. Kami juga don, t perlu khawatir tentang

    scrollbars dalam

    Misalnya, yang dapat menyulitkan perhitungan posisi objek kita dilayar. Tapi prinsip dasar

    masih sama. Dengan mengetahui lokasi awal dariobjek yang akan dipindahkan, dan mencatat

    nilai delta sentuhan kami dari ACTION_DOWNmelalui ACTION_UP, kami dapat

    menyesuaikan lokasi objek di layar.

    Menjatuhkan objek ke objek lain pada layar yang lebih sedikit untuk melakukan dengan

    sentuhandaripada yang dilakukannya dengan mengetahui di mana segala sesuatu di layar. Kami,Äôre tidak akan memberikancontoh di sini tentang menjatuhkan tetapi kami akan menjelaskan

    prinsip-prinsip. Seperti yang Anda lihat sebelumnya, seperti kita drag objek di layar, kita

    menyadari posisinya relatif terhadap satu atau lebihreferensi poin. Kami juga menginterogasi

    objek dapat pada layar untuk lokasi mereka danukuran. Kita kemudian dapat menentukan apakah

    objek kita menyeret adalah "lebih dari" obyek yang lain. Khasproses mencari tahu target drop

    untuk objek diseret adalah iterate melaluitersedia objek yang dapat kita drop, dan menentukan

    apakah kita saat ini posisi tumpang tindihbersama objek itu. Setiap ukuran dan posisi objek (dankadang-kadang bentuk) dapat digunakan untukmembuat penentuan ini. Jika kita mendapatkan

    suatu peristiwa ACTION_UP, yang berarti bahwa pengguna telah melepaskanobjek kita

    menyeret, dan objek selesai sesuatu yang dapat kita drop ke, maka kita dapatapi logika untuk

    proses tindakan drop. Ini mungkin tindakan menyeret sesuatuke tempat sampah, tempat objek

  • 8/19/2019 Bab 5 Android

    60/60

    diseret akan dihapus. Atau bias menyeret file ke folder untuk tuj