本实例主要使用了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 soundPoolMap = new HashMap();   @Override  public void onCreate(Bundle savedInstanceState) {  // TODO Auto-generated method stub  super.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();  }  @Override  protected void onDestroy() {  super.onDestroy();  if (mShakeListener != null) {   mShakeListener.stop();  }  } } 

代码:

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 soundPoolMap = new HashMap();   @Override  public void onCreate(Bundle savedInstanceState) {  // TODO Auto-generated method stub  super.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();  }  @Override  protected 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();  }  } 

代码:

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中添加权限,否侧摇动时不能监听

第四:效果图:

android重力感应开发之微信摇一摇功能_第1张图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. Android修改系统闹铃的持续时间
  2. Android Listview设置监听器并获取子项数据
  3. Android “2019-09-11T00:00:00+09:00“格式时间转换
  4. android时间比较
  5. Android(java)时间转换星期 昨天 今天 几分钟前工具
  6. Android 隔一段时间重复执行某代码
  7. android毫秒转化为时间
  8. 为什么我写的Android闹钟到时间时却不会响

随机推荐

  1. Android(安卓)build.gradle的基本配置参
  2. Android(安卓)同一个Service已经启动再多
  3. 自定义字体| Using a custom typeface in
  4. Android(安卓)开发简单记事本程序
  5. Android(安卓)Audio常用音频工具和分析方
  6. Android(安卓)ViewPager2使用小计
  7. android 随手记 自定义广播通知栏
  8. Android调用相机、相册上传头像并裁剪
  9. 安装Android(安卓)Studio
  10. 【Android(安卓)Studio安装部署系列】三