本实例主要使用了android的重力感应功能并配合动画效果实现,主要代码如下:

第一:ShakeActivity主类:

package com.android.shake;import java.io.IOException;import java.util.HashMap;import android.app.Activity;import android.media.AudioManager;import android.media.SoundPool;import android.os.Bundle;import android.os.Handler;import android.os.Vibrator;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.TranslateAnimation;import android.widget.Button;import android.widget.RelativeLayout;import android.widget.SlidingDrawer;import android.widget.SlidingDrawer.OnDrawerCloseListener;import android.widget.SlidingDrawer.OnDrawerOpenListener;import android.widget.Toast;import com.android.shake.ShakeListener.OnShakeListener;public class ShakeActivity extends Activity{ShakeListener mShakeListener = null;Vibrator mVibrator;private RelativeLayout mImgUp;private RelativeLayout mImgDn;private RelativeLayout mTitle;private SlidingDrawer mDrawer;private Button mDrawerBtn;private SoundPool sndPool;private HashMap<Integer, Integer> soundPoolMap = new HashMap<Integer, Integer>();@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.shake_activity);//drawerSet ();//设置  drawer监听    切换 按钮的方向mVibrator = (Vibrator)getApplication().getSystemService(VIBRATOR_SERVICE);mImgUp = (RelativeLayout) findViewById(R.id.shakeImgUp);mImgDn = (RelativeLayout) findViewById(R.id.shakeImgDown);mTitle = (RelativeLayout) findViewById(R.id.shake_title_bar);mDrawer = (SlidingDrawer) findViewById(R.id.slidingDrawer1);        mDrawerBtn = (Button) findViewById(R.id.handle);        mDrawer.setOnDrawerOpenListener(new OnDrawerOpenListener(){public void onDrawerOpened(){mDrawerBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.shake_report_dragger_down));TranslateAnimation titleup = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-1.0f);titleup.setDuration(200);titleup.setFillAfter(true);mTitle.startAnimation(titleup);}}); /* 设定SlidingDrawer被关闭的事件处理 */mDrawer.setOnDrawerCloseListener(new OnDrawerCloseListener(){public void onDrawerClosed(){mDrawerBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.shake_report_dragger_up));TranslateAnimation titledn = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-1.0f,Animation.RELATIVE_TO_SELF,0f);titledn.setDuration(200);titledn.setFillAfter(false);mTitle.startAnimation(titledn);}});loadSound() ;mShakeListener = new ShakeListener(this);        mShakeListener.setOnShakeListener(new OnShakeListener() {public void onShake() {//Toast.makeText(getApplicationContext(), "抱歉,暂时没有找到在同一时刻摇一摇的人。\n再试一次吧!", Toast.LENGTH_SHORT).show();startAnim();  //开始 摇一摇手掌动画mShakeListener.stop();sndPool.play(soundPoolMap.get(0), (float) 1, (float) 1, 0, 0,(float) 1.2);new Handler().postDelayed(new Runnable(){public void run(){//Toast.makeText(getApplicationContext(), "抱歉,暂时没有找到\n在同一时刻摇一摇的人。\n再试一次吧!", 500).setGravity(Gravity.CENTER,0,0).show();sndPool.play(soundPoolMap.get(1), (float) 1, (float) 1, 0, 0,(float) 1.0);Toast mtoast;mtoast = Toast.makeText(getApplicationContext(),     "抱歉,暂时没有找到\n在同一时刻摇一摇的人。\n再试一次吧!", 10);   //mtoast.setGravity(Gravity.CENTER, 0, 0);   mtoast.show();   mVibrator.cancel();   mShakeListener.start();   }}, 2000);}});   }private void loadSound() {sndPool = new SoundPool(2, AudioManager.STREAM_SYSTEM, 5);new Thread() {public void run() {try {soundPoolMap.put(0,sndPool.load(getAssets().openFd("sound/shake_sound_male.mp3"), 1));soundPoolMap.put(1,sndPool.load(getAssets().openFd("sound/shake_match.mp3"), 1));} catch (IOException e) {e.printStackTrace();}}}.start();}public void startAnim () {   //定义摇一摇动画动画AnimationSet animup = new AnimationSet(true);TranslateAnimation mytranslateanimup0 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-0.5f);mytranslateanimup0.setDuration(1000);TranslateAnimation mytranslateanimup1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,+0.5f);mytranslateanimup1.setDuration(1000);mytranslateanimup1.setStartOffset(1000);animup.addAnimation(mytranslateanimup0);animup.addAnimation(mytranslateanimup1);mImgUp.startAnimation(animup);AnimationSet animdn = new AnimationSet(true);TranslateAnimation mytranslateanimdn0 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,+0.5f);mytranslateanimdn0.setDuration(1000);TranslateAnimation mytranslateanimdn1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-0.5f);mytranslateanimdn1.setDuration(1000);mytranslateanimdn1.setStartOffset(1000);animdn.addAnimation(mytranslateanimdn0);animdn.addAnimation(mytranslateanimdn1);mImgDn.startAnimation(animdn);}public void startVibrato(){//定义震动mVibrator.vibrate( new long[]{500,200,500,200}, -1); //第一个{}里面是节奏数组, 第二个参数是重复次数,-1为不重复,非-1俄日从pattern的指定下标开始重复}public void shake_activity_back(View v) {     //标题栏 返回按钮      this.finish();      }  public void linshi(View v) {     //标题栏startAnim();      }  @Overrideprotected void onDestroy() {super.onDestroy();if (mShakeListener != null) {mShakeListener.stop();}}}

第二:一个检测手机摇晃的监听器类ShakeListener ,代码如下:

package com.android.shake;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.util.Log;/** * 一个检测手机摇晃的监听器 */public class ShakeListener implements SensorEventListener {// 速度阈值,当摇晃速度达到这值后产生作用private static final int SPEED_SHRESHOLD = 2000;// 两次检测的时间间隔private static final int UPTATE_INTERVAL_TIME = 70;// 传感器管理器private SensorManager sensorManager;// 传感器private Sensor sensor;// 重力感应监听器private OnShakeListener onShakeListener;// 上下文private Context mContext;// 手机上一个位置时重力感应坐标private float lastX;private float lastY;private float lastZ;// 上次检测时间private long lastUpdateTime;// 构造器public ShakeListener(Context c) {// 获得监听对象mContext = c;start();}// 开始public void start() {// 获得传感器管理器sensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);if (sensorManager != null) {// 获得重力传感器sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);}// 注册if (sensor != null) {sensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_GAME);}}// 停止检测public void stop() {sensorManager.unregisterListener(this);}// 设置重力感应监听器public void setOnShakeListener(OnShakeListener listener) {onShakeListener = listener;}// 重力感应器感应获得变化数据public void onSensorChanged(SensorEvent event) {// 现在检测时间long currentUpdateTime = System.currentTimeMillis();// 两次检测的时间间隔long timeInterval = currentUpdateTime - lastUpdateTime;// 判断是否达到了检测时间间隔if (timeInterval < UPTATE_INTERVAL_TIME)return;// 现在的时间变成last时间lastUpdateTime = currentUpdateTime;// 获得x,y,z坐标float x = event.values[0];float y = event.values[1];float z = event.values[2];// 获得x,y,z的变化值float deltaX = x - lastX;float deltaY = y - lastY;float deltaZ = z - lastZ;// 将现在的坐标变成last坐标lastX = x;lastY = y;lastZ = z;double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ* deltaZ)/ timeInterval * 10000;// 达到速度阀值,发出提示if (speed >= SPEED_SHRESHOLD) {onShakeListener.onShake();}}public void onAccuracyChanged(Sensor sensor, int accuracy) {}// 摇晃监听接口public interface OnShakeListener {public void onShake();}}

第三:必须在AndroidManifest.xml中添加权限,否侧摇动时不能监听

<uses-permission android:name="android.hardware.sensor.accelerometer"/>

第四:效果图:


项目代码在下面附件

更多相关文章

  1. Android/Java面试题收集
  2. 仿微信摇一摇功能,android 重力感应开发
  3. 仿微信摇一摇功能,android 重力感应开发
  4. Android为按钮添加相应事件的代码
  5. Android——按钮的事件监听
  6. Android(安卓)编程 设计规范
  7. Android(安卓)API教程:人脸检测(Face Detect)
  8. 如何在Android真机上检测是否有Google Map add-on
  9. Android(安卓)API教程:人脸检测(Face Detect)

随机推荐

  1. Android定义的路径全局变量
  2. android学习资料汇总
  3. Android(安卓)native crash log分析
  4. android light
  5. Android中菜单的使用
  6. android根据字体大小设置控件高度
  7. Android(安卓)Gesture Detector
  8. android edittext 初始不获取焦点 androi
  9. android 往sd卡中写入文件
  10. repo/git Android/CyanogenMod srouce co