3.安卓模仿微信摇一摇功能

来源:互联网 发布:java开发求职简历 编辑:程序博客网 时间:2024/05/29 19:34

本例中主要就是使用
SensorManager类获取传感器服务
注册SensorEventListener,用它感知加速度传感器的读值变化,就是我们晃动手机的加速度的AD量
Vibrator类在手机摇动的情况下,开始振动。
所以,OnCreate中开始就try 创建两个类的实例 获取系统相关的服务
OnResume方法中:
为SensorManager注册监听器

mSensorManager.registerListener(mSensorEventListener,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
对应的,我们希望当Activity不在前台时,摇动不要引起振动

    mSensorManager.unregisterListener(mSensorEventListener);    super.onPause();

实时显示传感器三轴信息

str="x="+df.format(x)+"y="+df.format(y)+"z="+df.format(z);textView.setText(str);if (Math.abs(x)>gate&&shakeThread==null){isRunning=true;shakeThread=new thread(handler);shakeThread.start();}
判断一下X是否超过我们设置的阈值

超过就开启一个线程振动

 try {                 for (int i=0; i<2; i++) {                if (i==0) Thread.sleep(1000);                    else Thread.sleep(300);                    mVibrator.vibrate(200);                }                Thread.sleep(1500);                }catch(InterruptedException e) {                                          e.printStackTrace();            }
故意检测两次,不然摇动时几乎没有延迟,效果不好

第一次检测到后让线程睡一秒

在第二次检测到摇动后不久就振动吧

让该线程再睡会觉,两次振动间隔也不要太紧

以上的关键代码如果掌握了,以下的完整代码不看也罢

package com.ljh.shake;import java.text.DecimalFormat;import android.app.Activity;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.Vibrator;import android.view.Menu;import android.widget.TextView;import android.widget.Toast;public class ShakeAct extends Activity {private SensorManager mSensorManager;private Vibrator mVibrator;private TextView textView;private BooleanisRunning;private threadshakeThread;private static final int SENSOR_SHAKE = 10;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_shake);        textView=(TextView)findViewById(R.id.textView);        try        {        mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);        mVibrator=(Vibrator)getSystemService(Context.VIBRATOR_SERVICE);        }                catch(Exception e)        {        e.printStackTrace();        }    }       @Override   protected void onResume() {// TODO Auto-generated method stubmSensorManager.registerListener(mSensorEventListener,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);super.onResume();}    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.activity_shake, menu);        return true;    }        @Override    protected void onPause() {    // TODO Auto-generated method stub        mSensorManager.unregisterListener(mSensorEventListener);    super.onPause();    }                private SensorEventListener mSensorEventListener=new SensorEventListener() {public void onSensorChanged(SensorEvent arg0) {// TODO Auto-generated method stubDecimalFormat df=new DecimalFormat("##.#");float values[]=arg0.values;float x=values[0];float y=values[1];float z=values[2];float gate=18;String str;str="x="+df.format(x)+"y="+df.format(y)+"z="+df.format(z);textView.setText(str);if (Math.abs(x)>gate&&shakeThread==null){isRunning=true;shakeThread=new thread(handler);shakeThread.start();}}public void onAccuracyChanged(Sensor arg0, int arg1) {// TODO Auto-generated method stub}};    public Handler handler=new Handler(){public void handleMessage(Message msg) {switch(msg.what){case 0:Toast.makeText(ShakeAct.this,"执行操作",Toast.LENGTH_SHORT).show();shakeThread=null;}};};private class thread extends Thread{ private Handler handler;                  public thread(Handler handler) {// TODO Auto-generated constructor stub        this.handler=handler;}         @Override         public void run() {         isRunning=true;                                             try {                 for (int i=0; i<2; i++) {                if (i==0) Thread.sleep(1000);                    else Thread.sleep(300);                    mVibrator.vibrate(200);                }                Thread.sleep(1500);                }catch(InterruptedException e) {                                          e.printStackTrace();                                                                 }                                    Message msg = handler.obtainMessage();             msg.what=0;            handler.sendMessage(msg);         }              }             }