Bab 5 Android
-
Upload
rizky-maula -
Category
Documents
-
view
221 -
download
0
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