Animasi di canvas cocok digunakan untuk game sederhana seperti game berjenis puzzle yang melibatkan sedikit objek dan tidak memperlukan animasi berat. Canvas juga lebih sederhana dibandingkan dengan OpenGL
Animasi dapat dilakukan dengan membersihkan layar dan menggambar objek di tempat yang baru. Class Asyntask dapat digunakan untuk mengatur posisi objek dan jeda antar frame. Asyntask melakukan proses dibackground, sehingga app tidak terkunci dan tetap responsif.
Berikut adalah contoh codenya. Buat project baru, tambahkan class GraphicsView yang merupakan turunan View seperti pada contoh sebelumnya. Class ini akan membersihkan layar dan menggambar image sesuai posisi.
package com.example.cobaanimasibmp; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View;
public class GraphicsView extends View{ //posisi bola
public float posX=0;
public float posY=0;
public Bitmap bmpGambar;
private Paint cat = new Paint();
public GraphicsView(Context context) {
super(context); }
@Override
protected void onDraw(Canvas c) {
//clear screen
c.drawColor(Color.WHITE);
//gambar bitmap
c.drawBitmap(bmpGambar,posX,posY,cat); }
}
Selanjutnya buat class AnimasiTask yang merupakan turunan dari Asynctask. Kelas ini berperan untuk mengatur posisi bola dan memerintahkan agar canvas didraw ulang setiap posisi berubah.
package com.example.cobaanimasibmp;
import android.os.AsyncTask;
import android.util.Log;
public class AnimasiTask extends AsyncTask <Void, Void, Void> {
public GraphicsView gv; //tempat animasi digambar @Override
protected Void doInBackground(Void... arg0) {
// method ini dijalankan di background secara asynchronous
for (int i=10;i<600;i=i+20) {
//bergerak diagonal
gv.posX=i;
gv.posY=i;
//publisgProgress adalah method standard di Asyntask //dipanggil pada saat loop untuk memberikan kesempatan
//tidur 0.2 detik, agar animasi tdk terlalu cepat
try {
Thread.sleep((long)(1000*0.2)); } catch (InterruptedException e) {
e.printStackTrace();
Log.e("yw","error saat mencoba sleep"+e.getMessage()); }
}
return null; }
@Override
protected void onProgressUpdate(Void... progress) {
gv.postInvalidate(); //refresh canvas agar menggambar image di posisi baru
} }
Terakhir, di-activity utama tambahkan code berikut:
package com.example.cobaanimasibmp; import android.os.Bundle; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.Menu;
public class MainActivity extends Activity {
private GraphicsView gv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gv= new GraphicsView( this); Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
gv.bmpGambar = bmp; setContentView(gv);
AnimasiTask at = new AnimasiTask(); at.gv = gv;
at.execute(); //jalankan animasi secara async dan dibackground
} }
Latihan:
Buatlah game sederhana memukul serangga di layar. Program menampilkan kotak di layar, jika pengguna ‘memukulnya’ dengan jari, maka pengguna mendapat skor. Tampilkan animasi jika kotak terkena pukulan (misal kotak berubah warna).
Sensor
Android mendukung berbagai sensor, mulai dari yang umum tersedia seperti accelerometer, magnetometer, GPS sampai barometer, termometer dan pengukur kelembaban.
Accelerometer
Accelerometer adalah alat yang mengukur akselerasi atau percepatan (perubahan kecepatan) baik yang disebabkan hal yang statik seperti gaya gravitasi (ingat bahwa benda yang jatuh mengalami percepatan) maupun perubahan dinamik seperti saat device bergerak atau bergetar.
Dengan mengukur gaya gravitasi, kita bisa mengetahui sudut kemiringan device. Sedangkan dengan mengukur akselerasi dinamik kita bisa mengetahui ke arah mana benda bergerak dan secepat apa.
Penggunaan accelerometer di smartphone/tablet yang paling umum adalah mendeteksi posisi portrait dan landscape. Selain itu telah ada app yang memanfaatkan accelerometer untuk menghitung kecepatan dan jarak lari, membunyikan alarm jika device dipindahkan, game dan sebagainya.
Sebagian besar device Android memiliki sensor accelerometer ini. Sensor ini mengukur perubahan kecepatan di tiga sumbu: x, y dan z (gambar bawah). Satuannya adalah m/det^2. Gaya gravitasi selalu mempengaruhi. Sehingga jika device diletakkan diam, nilai sumbu z tetap terbaca sekitar 9.8m/det^2.
Diambil dari: http://developer.android.com/reference/android/hardware/SensorEvent.html
Untuk menggunakan sensor di Android, class yang harus digunakan adalah SensorManager untuk mengetahui apakah device mensupport sensor yang kita inginkan. Kemudian class Sensor untuk mendapatkan data dari sensor dan interface
import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.Menu; import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mSensor;
private TextView tvHasil;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
tvHasil = (TextView) findViewById(R.id.textView1);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){ //device memiliki accelerometer,lanjutkan
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL); }
else {
//tidak punya sensor accelerometer, tampilkan pesan error
} }
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// kalau akurasi berubah
}
@Override
public void onSensorChanged(SensorEvent event) {
double ax=0,ay=0,az=0;
// menangkap perubahan nilai sensor
//if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) { ax=event.values[0];
ay=event.values[1]; az=event.values[2]; }
//ax,ay,az bisa digunakan
tvHasil.setText("x:"+ax+" y:"+ay+" z:"+az); }
@Override
protected void onPause() {
//app kehilangan fokus (misal user menerima telp), lepaskan sensor
super.onPause();
mSensorManager.unregisterListener(this); }
@Override
protected void onResume() {
//app kembali
super.onResume();
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); //SENSOR_DELAY_NORMAL:sampling setiap 200,000 microseconds
//SENSOR_DELAY_GAME: 20,000 microsecond
//SENSOR_DELAY_UI: 60,000 microsecond
//SENSOR_DELAY_FASTEST: 0 microsecond
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true; }
}
Masalahnya adalah AVD tidak mensupport accelerometer sehingga saat app harus dijalankan pada device langsung. Caranya bisa dengan langsung menghubungkan atau manual melalui APK.
Agar langsung dapat menjalankan app pada device, hubungan handphone/tablet dengan komputer melalui kabel USB. Pastikan USB driver telah terinstall. Untuk jenis Nexus, usb driver dapat diinstall melalui SDK manager (Extra Google USB Driver).
Kemudian klik kanan project Run As Run Configuration
Pilih tab target, lalu pilih launch on all … dengan “Active Devices”
Catatan: Jika menu Developer Option tidak muncul pada Android versi 4.2.*, maka untuk mengaktifkannya pilih settings About Phone, lalu tap “Build Number” sebanyak tujuh kali.