Android實現搖一搖功能

jopen 10年前發布 | 14K 次閱讀 Android Android開發 移動開發

搖一搖功能主要用到加速度傳感器Sensor.TYPE_ACCELEROMETER

搖一搖功能主要是監聽手機加速度變化,當超過設定的某一值時,即觸發事件

/**
 * FileName: MainActivity.java
 * @desc 該類是用于顯示搖一搖界面
 * @author HTP
 * @Date    20140311
 * @version 1.00 
 */
public class MainActivity extends Activity implements OnClickListener {
    private TabHost tabHost;
    private MusicNameDao dao;
    // private ImageButton bt_setMusic;
    // 聲音
    private MediaPlayer mediaPlayer;
    // 顯示搖一搖出現的內容
    private TextView tv;
    // 要顯示在tv中的內容
    private String msentence;
    // 通過類Sentence可得到搖一搖顯示的內容
    private Sentence sentence;
    // 顯示標簽“刮一刮”
    private TextView tv_rubbler;
    // 重力感應管理器
    private SensorManager sensorManager;
    // 震動控件
    private Vibrator vibrator;
    // 標簽
    private static final String TAG = "MainActivity";
    private static final int SENSOR_SHAKE = 10;

    // private Intent musicIntent = new Intent("com.angel.Android.MUSIC");
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dao = new MusicNameDao(this);
        Uri musicUri = Uri.parse("android.resource://com.example.romance/raw/"
                + dao.getName());

        mediaPlayer = MediaPlayer.create(this, musicUri);
        //Toast.makeText(MainActivity.this, musicUri.toString(), 1).show();
        mediaPlayer.start();// 播放音樂
        mediaPlayer.setLooping(true);// 設置循環
        dao = new MusicNameDao(this);
        // startService(musicIntent);
        tv_rubbler = (TextView) findViewById(R.id.tv_rubber);
        tv_rubbler.setOnClickListener(this);
        // bt_setMusic.setOnClickListener(this);

        sentence = new Sentence();
        // Uri musicUri = Uri.parse("/sdcard/ttpod/song/虹之間.mp3");
        // 獲取res/raw/下的音樂路徑

        tv = (TextView) findViewById(R.id.tv_text);// 關聯要顯示的TextView空間
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (sensorManager != null) {// 注冊監聽器
            sensorManager.registerListener(sensorEventListener,
                    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
            // 第一個參數是Listener,第二個參數是所得傳感器類型,第三個參數值獲取傳感器信息的頻率
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (sensorManager != null) {// 取消監聽器
            sensorManager.unregisterListener(sensorEventListener);
        }
    }

    /**
     * 重力感應監聽
     */
    private SensorEventListener sensorEventListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            // 傳感器信息改變時執行該方法
            float[] values = event.values;
            float x = values[0]; // x軸方向的重力加速度,向右為正
            float y = values[1]; // y軸方向的重力加速度,向前為正
            float z = values[2]; // z軸方向的重力加速度,向上為正
            Log.i(TAG, "x軸方向的重力加速度" + x + ";y軸方向的重力加速度" + y + ";z軸方向的重力加速度" + z);
            // 一般在這三個方向的重力加速度達到40就達到了搖晃手機的狀態。
            int medumValue = 18;
            if (Math.abs(x) > medumValue && Math.abs(y) > medumValue
                    || Math.abs(y) > medumValue && Math.abs(z) > medumValue
                    || Math.abs(x) > medumValue && Math.abs(z) > medumValue
                    ) {
                vibrator.vibrate(200);
                Message msg = new Message();
                msg.what = SENSOR_SHAKE;
                handler.sendMessage(msg);
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };
    /**
     * 動作執行
     */
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case SENSOR_SHAKE:
                msentence = sentence.getSentence();// 得到隨機的句子
                // Toast.makeText(MainActivity.this, msentence, 1).show();
                tv.setText(msentence);// 將得到的句子顯示在textview上
                // Log.i(TAG, "檢測到搖晃,執行操作!");
                break;
            }
        }
    };

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        mediaPlayer.stop(); // 退出時停止音樂

    }

    /**
     * 鍵盤事件,當按下back鍵的時候詢問是否再按一次退出程序
     */
    // 退出時間
    private long exitTime = 0;

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK
                && event.getAction() == KeyEvent.ACTION_DOWN) {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                Toast.makeText(getApplicationContext(), "再按一次退出程序",
                        Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                finish();
                System.exit(0);

            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 按鈕事件監聽
     */
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        // 當按下按鈕,將切換到刮一刮頁面
        case R.id.tv_rubber: {
            Toast.makeText(MainActivity.this, "刮一刮", 1).show();
            Intent rubblerIntent = new Intent(MainActivity.this,
                    RubblerAct.class);
            startActivity(rubblerIntent);
            break;
        }
        default:
            break;
        }
    }

}

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!