package com.example.android.recipe074; import java.util.List; import android.app.Activity; import android.graphics.Matrix; import android.graphics.drawable.Drawable; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.Display; import android.widget.ImageView; public class Recipe074 extends Activity implements SensorEventListener { // センサーマネージャー private SensorManager mSensorManager; // 方位磁針の代わりの画像 private ImageView mImageView; // ディスプレイの中心座標 private float mCenterX; private float mCenterY; // ImageViewを回転させるためのMatrix private Matrix mMatrix; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSensorManager = (SensorManager)getSystemService( SENSOR_SERVICE); mImageView = (ImageView)findViewById(R.id.image); mMatrix = new Matrix(); // android:scaleType="matrix"にすると // 自力で画面中央に表示しなければいけないので // 頑張って計算 // もっと簡単な方法があれば是非教えてください。 // ディスプレイのサイズを取得 Display display = getWindowManager().getDefaultDisplay(); int dispWidth = display.getWidth(); int dispHeight = display.getHeight(); // 画像のサイズを取得 Drawable d = getResources().getDrawable(R.drawable.src); int imgWidth = d.getIntrinsicWidth(); int imgHeight = d.getIntrinsicHeight(); // これは中央に移動するために // 中心座標から画像のサイズの半分だけ // 左上にずらした座標 float x = (dispWidth - imgWidth) / 2; float y = (dispHeight - imgHeight) / 2; // 中央に移動! mMatrix.postTranslate(x, y); mImageView.setImageMatrix(mMatrix); // 中心座標を回転時に使うので保持 mCenterX = dispWidth / 2f; mCenterY = dispHeight / 2f; } @Override protected void onResume() { super.onResume(); // 傾きセンサーを取得 List<Sensor> list = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION); // 取得できなければ何もしない if (list.size() < 1) return; // 傾きセンサーを取得 Sensor sensor = list.get(0); // 傾きセンサーにリスナーを登録 // 第3引数で感度を指定できます。 mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override public void onPause() { super.onPause(); // リスナーを解除 mSensorManager.unregisterListener(this); } public void onAccuracyChanged(Sensor sensor, int accuracy) { } private float mPreValue = 0; // センサーの値が変化したら呼び出される public void onSensorChanged(SensorEvent event) { // 傾きセンサー以外は何もしない。 if (event.sensor.getType() != Sensor.TYPE_ORIENTATION) { return; } // 値を取得 float value = event.values[0]; // Matrixに回転する角度と中心座標をセット mMatrix.postRotate(mPreValue - value, mCenterX, mCenterY); // 回転! mImageView.setImageMatrix(mMatrix); // 今回の値を保持 mPreValue = value; } }