• Tidak ada hasil yang ditemukan

Animasi di Canvas

Dalam dokumen IF MATERI MOBILE PROGRAMMING (Halaman 87-93)

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.

Dalam dokumen IF MATERI MOBILE PROGRAMMING (Halaman 87-93)

Dokumen terkait