本实例主要使用了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 重力感应开发
  2. Android为按钮添加相应事件的代码
  3. Android——按钮的事件监听
  4. Android(安卓)编程 设计规范
  5. Android(安卓)API教程:人脸检测(Face Detect)
  6. 如何在Android真机上检测是否有Google Map add-on
  7. Android(安卓)API教程:人脸检测(Face Detect)
  8. Android常用控件总结
  9. Android重力感应实现方式简介

随机推荐

  1. 安卓的下拉控件Spinner
  2. [转]android:利用DatabaseUtils.InsertHel
  3. Android(安卓)中文 API (21) —— DigitalC
  4. #Android学习笔记(二)#
  5. android安装和卸载程序
  6. Android(安卓)AIDL例子
  7. eclipse的android智能提示设置
  8. 动画效果编程基础--AnimationAndroid
  9. Android(安卓)ListView常见属性问题
  10. React Native与Android通信——Android(