热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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 = SPEED_SHRESHOLD) {
vibrator.vibrate(300);
image.setImageResource(R.drawable.running01);
}
}


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

}
};

}

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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • MATLAB实现n条线段交点计算
    本文介绍了一种通过逐对比较线段来求解交点的简单算法。此外,还提到了一种基于排序的方法,但该方法较为复杂,尚未完全理解。文中详细描述了如何根据线段端点求交点,并判断交点是否在线段上。 ... [详细]
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文深入探讨了 Python 列表切片的基本概念和实际应用,通过具体示例展示了不同切片方式的使用方法及其背后的逻辑。 ... [详细]
  • 本文详细介绍了K-Medoids聚类算法,这是一种基于划分的聚类方法,适用于处理大规模数据集。文章探讨了其优点、缺点以及具体实现步骤,并通过实例进行说明。 ... [详细]
  • 本文探讨如何利用人工智能算法自动区分网页是详情页还是列表页,介绍具体的实现思路和技术细节。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
author-avatar
sundy柳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有