Android实现摇一摇功能_Android

实现“摇一摇”功能,其实很简单,就是检测手机的重力感应,具体实现代码如下:

1、在 AndroidManifest.xml 中添加操作权限

2、实现代码

 package com.xs.test; 

import android.app.Activity;
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.util.Log;
import android.widget.Toast; 

/**
 * 安卓晃动手机监听--“摇一摇”
 *
 * @author 单红宇
 *
 */
public class TestSensorActivity extends Activity { 

  private SensorManager sensorManager;
  private Vibrator vibrator; 

  private static final String TAG = "TestSensorActivity";
  private static final int SENSOR_SHAKE = 10; 

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    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 = 19;// 三星 i9250怎么晃都不会超过20,没办法,只设置19了
      if (Math.abs(x) > medumValue || Math.abs(y) > 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:
        Toast.makeText(TestSensorActivity.this, "检测到摇晃,执行操作!", Toast.LENGTH_SHORT).show();
        Log.i(TAG, "检测到摇晃,执行操作!");
        break;
      }
    } 

  };
}

这种摇一摇比较普通,没有经过算法的加强,重力加速度就是10。
算法优化如下

package com.example.url;

import java.io.IOException;
import java.net.URL;

import com.hahashijie.imageload.ImageLoader;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
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.util.Log;
import android.widget.ImageView;

@SuppressLint("HandlerLeak")
public class MainActivity extends Activity {

private ImageView image;
private SensorManager sensorManager;
private Sensor sensor;
private Vibrator vibrator;
private static final int UPTATE_INTERVAL_TIME = 50;
private static final int SPEED_SHRESHOLD = 30;//这个值调节灵敏度
private long lastUpdateTime;
private float lastX;
private float lastY;
private float lastZ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
image = (ImageView) findViewById(R.id.image);

}

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (sensorManager != null) {
      sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }
    if (sensor != null) {
    sensorManager.registerListener(sensorEventListener,
    sensor,
SensorManager.SENSOR_DELAY_GAME);//这里选择感应频率
    }
}

/**
* 重力感应监听
*/
private SensorEventListener sensorEventListener = new SensorEventListener() {

@Override
public void onSensorChanged(SensorEvent event) {
long currentUpdateTime = System.currentTimeMillis();
long timeInterval = currentUpdateTime - lastUpdateTime;
if (timeInterval < UPTATE_INTERVAL_TIME) {
return;
}
lastUpdateTime = currentUpdateTime;
// 传感器信息改变时执行该方法
float[] values = event.values;
float x = values[0]; // x轴方向的重力加速度,向右为正
float y = values[1]; // y轴方向的重力加速度,向前为正
float z = values[2]; // z轴方向的重力加速度,向上为正
float deltaX = x - lastX;
float deltaY = y - lastY;
float deltaZ = z - lastZ;

lastX = x;
lastY = y;
lastZ = z;
double speed = (Math.sqrt(deltaX * deltaX + deltaY * deltaY
+ deltaZ * deltaZ) / timeInterval) * 100;
if (speed >= SPEED_SHRESHOLD) {
vibrator.vibrate(300);
image.setImageResource(R.drawable.running01);
}
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}
};

}

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
摇一摇
android摇一摇实现、ios 摇一摇功能实现、ios摇一摇功能的实现、安卓摇一摇功能实现、h5摇一摇功能实现,以便于您获取更多的相关知识。

时间: 2024-10-31 20:12:25

Android实现摇一摇功能_Android的相关文章

Android ShareSDK快速实现分享功能_Android

第一步 :获取ShareSDK 为了集成ShareSDK,您首先需要到ShareSDK官方网站注册并且创建应用,获得ShareSDK的Appkey,然后到SDK的下载页面下载SDK的压缩包,解压以后可以得到如下图的目录结构: ShareSDK在"ShareSDK for Android"目录下,此目录中的"Libs"包含"MainLibs"和"OnekeyShare" 分别是ShareSDK的核心库和"快捷分享&qu

Android仿微信语音聊天功能_Android

本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.weichat; import java.io.File; import java.io.IOException; import java.util.UUID; import android.media.MediaRecorder; public class AudioManager { private

Android 使用Path实现涂鸦功能_Android

今天实现一个涂鸦效果,会分几步实现,这里有一个重要的知识点就是图层,要理解这个,不然你看这篇博客,很迷茫,迷茫的苍茫的天涯是我的爱,先从简单的需求做起,绘制一条线,代码如下: package com.tuya; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.util

Android实现短信发送功能_Android

本文实例实现了两个模拟器之间短信的发送功能,分享给大家供大家参考,具体实现内容如下 1.编辑String.xml文件内容为: <?xml version="1.0″ encoding="utf-8″?> <resources> <string name="app_name">SendMesage</string> <string name="action_settings">Settin

Android利用Chronometer实现倒计时功能_Android

项目需要实现一个计时的功能,利用Chronometer虽然可以很方便的实现计时功能,但需要的却是一个倒计时控件. 百度了一下方法不少,倒计时的却没有,于是用Chronometer封装了一个倒计时的类,本着开源的精神,分享给大家! 废话不说了,进入主题 首先xml布局如下: <com.example.anticlockwisedemo.Anticlockwise android:id="@+id/id_timer" android:layout_width="wrap_c

Android 实现双击退出的功能_Android

实现android双击后退键退出当前APP功能 实现该功能基本思路是, 1, 监听后退键 , 比较两次后退间隔 , 低于两秒则出发退出 2, 退出当前APP 我选择在基类中BaseActivity 中设置监听,代码如下: public void onBackPressed() { //Preferences 中获取是否双击退出 boolean isDoubleClick = true; //BaseApplication.get("ifDoubleClickedBack", true)

Android基于CountDownTimer实现倒计时功能_Android

本文实例讲述了Android编程基于CountDownTimer实现倒计时功能的方法.分享给大家供大家参考,具体如下: 在逛论坛的时候,看到一个网友提问,说到了CountDownTimer这个类,从名字上面大家就可以看出来,记录下载时间.将后台线程的创建和Handler队列封装成一个方便的类调用. 查看了一下官方文档,这个类及其简单,只有四个方法,上面都涉及到了onTick,onFinsh.cancel和start.其中前面两个是抽象方法,所以要重写一下. 下面是官方给的一个小例子: new C

Android实现标题显示隐藏功能_Android

本文实例尝试模仿实现Android标题显示隐藏功能,通过给listview设置 mListView.setOnTouchListener 监听 重写ontouch方法 监听手指一动的坐标,当超过ViewConfiguration.get(this).getScaledTouchSlop(); toubar的高度 .当向上滑动超过这个高度显示touba 向下滑动隐藏. 效果图: package com.example.hidetitlebardemo; import android.animati

非常简单的Android打开和保存对话框功能_Android

在Android上没有标准的打开和另存为对话框.在本代码中,我将详细描述一个非常简单的打开和保存对话框实现过程,对于Android初学者来说非常有用,对话框都是全屏活动的. 主要功能: 1.访问任何目录的SD卡 2.递归访问文件夹 3.单一文件选择 4.通过按硬件后退按钮升级 5.确认文件选择OK按钮  activity_open_file.xml <LinearLayout xmlns:android="<a href="http://schemas.android.co

使用Java代码在Android中实现图片裁剪功能_Android

前言Android应用中经常会遇到上传相册图片的需求,这里记录一下如何进行相册图片的选取和裁剪. 相册选取图片1. 激活相册或是文件管理器,来获取相片,代码如下: private static final int TAKE_PICTURE_FROM_ALBUM = 1; private void takePictureFromAlbum() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image