我要开始摇一摇了
来源:互联网 发布:有关数据库的参考文献 编辑:程序博客网 时间:2024/05/29 14:52
博客一:
package com.example.testcamera;
import Android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.SystemClock;
/**
* @author Ranger
* 摇动类
*
*/
public class Shaker {
/**
* 传感器管理
*/
private SensorManager mgr = null;
/**
*最后摇动的时间
*/
private long lastShakeTimestamp = 0;
/**
* 偏移量设置
*/
private double threshold = 1.0d;
/**
* 摇动的时间间隔设置
*/
private long gap = 0;
/**
* 回调
*/
private Shaker.Callback cb = null;
/**
* 变量控制,防止多次启动
*/
private boolean mPause = false;
/**
* 传感器类
* @param ctxt 上下文
* @param threshold 偏移量
* @param gap 传感器的时间
* @param cb 回调方法
*/
public Shaker(Context ctxt, double threshold, long gap,
Shaker.Callback cb) {
this.threshold = threshold * threshold;
this.threshold = this.threshold
* SensorManager.GRAVITY_EARTH
* SensorManager.GRAVITY_EARTH;
this.gap = gap;
this.cb = cb;
//注册传感器
mgr = (SensorManager) ctxt.getSystemService(Context.SENSOR_SERVICE);
//注册传感器的监听事件
mgr.registerListener(listener,
mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
}
public void close() {
mgr.unregisterListener(listener);
}
private void isShaking() {
long now = SystemClock.uptimeMillis();
if (lastShakeTimestamp == 0) {
lastShakeTimestamp = now;
if (cb != null) {
cb.shakingStarted();
}
}
else {
lastShakeTimestamp = now;
}
}
private void isNotShaking() {
long now = SystemClock.uptimeMillis();
if (lastShakeTimestamp > 0) {
if (now - lastShakeTimestamp > gap) {
lastShakeTimestamp = 0;
if (cb != null) {
cb.shakingStopped();
}
}
}
}
public interface Callback {
void shakingStarted();
void shakingStopped();
}
private SensorEventListener listener = new SensorEventListener() {
public void onSensorChanged(SensorEvent e) {
if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
double netForce = e.values[0] * e.values[0];
netForce += e.values[1] * e.values[1];
netForce += e.values[2] * e.values[2];
//偏移量,X^2 + Y^2 + Z^2 与最大的偏移量threshold相比,如果超过就作为在摇动
if ((threshold < netForce) && !mPause) {
isShaking();
}
else {
isNotShaking();
}
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// unused
}
};
public void resume() {
mPause = false;
}
public void pause() {
mPause = true;
}
}
调用方式为:
//创建摇动对象
shaker = new Shaker(this, 1.25d, 500, this);
@Override
protected void onResume() {
super.onResume();
shaker.resume();
}
@Override
public void shakingStarted() {
Log.e("ShakerDemo", "Shaking started!");
shaker.pause();
Toast.makeText(getApplicationContext(), "正在启动相机,请稍候……",
Toast.LENGTH_LONG).show();
}
实例代码地址为:http://download.csdn.net/detail/ajun495175289/5654559
博客二:
自从微信里的摇一摇功能为大家所熟知了以后,似乎摇一摇已经成了移动应用不可缺少的功能,不管什么类型的应用,只有加上了摇一摇才显得足够时尚。其实对于一款产品而言,我们真正应该关注的是用户需要什么,而不是很主观地去强迫用户适应这种看似很杀手级的功能。要知道,在用户的手机里,你只是众多应用中的一个而已,下一秒钟用户会选择谁,我们都不知道。好了,闲话少叙,我们都知道摇一摇是充分发挥了手机的硬件优势,即传感器。在安卓中和 Notofication类似,我们有SensorManager和Sensor两个类供我们使用。先来说一下,摇一摇的原理。摇一摇的原理是基于手机里的加速度传感器,当用户摇晃手机时,在X、Y、Z三个方向的加速度会发生变化。其中,X方向值的大小代表手机水平移动,Y方向值的大小代表手机垂直移动,Z方向值的大小代表手机的空间垂直方向,天空的方向为正,地球的方向为负,然后把相关的加速度值传输给操作系统,通过判断其大小变化,就能判断用户是否摇晃手机啦。对于Android而言,其本身就提供了很好的API接口,因设备而已,实际使用时,用户手机中可能并没有这样的传感器,所以对于 Android开发而言,绝对不能想当然地认为程序写对了就一定没什么问题啦(真心不想吐槽Android的屏幕、各种因为被阉割而形同虚设的API)。 Android中开发传感器相关的应用,必须实现SensorEventListener接口。下面我们以一个例子来展示这个接口的实现:
package com.Android.Shake2Shake; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.widget.Toast; public class ShakeHelper implements SensorEventListener { private Context mContext; //传感器管理器 private SensorManager mSensorManager; //传感器 private Sensor mSensor; //速度阀值 private int mSpeed=3000; //时间间隔 private int mInterval=50; //上一次摇晃的时间 private long LastTime; //上一次的x、y、z坐标 private float LastX,LastY,LastZ; public ShakeHelper(Context mContext) { this.mContext=mContext; Start(); } public void Start() { mSensorManager=(SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE); if(mSensorManager!=null) { mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } if(mSensor!=null) { mSensorManager.registerListener(this, mSensor,SensorManager.SENSOR_DELAY_GAME); } } public void Stop() { mSensorManager.unregisterListener(this); } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { } @Override public void onSensorChanged(SensorEvent Event) { long NowTime=System.currentTimeMillis(); if((NowTime-LastTime)<mInterval) return; //将NowTime赋给LastTime LastTime=NowTime; //获取x,y,z float NowX=Event.values[0]; float NowY=Event.values[1]; float NowZ=Event.values[2]; //计算x,y,z变化量 float DeltaX=NowX-LastX; float DeltaY=NowY-LastY; float DeltaZ=NowZ-LastZ; //赋值 LastX=NowX; LastY=NowY; LastZ=NowZ; //计算 double NowSpeed = Math.sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ * DeltaZ)/mInterval * 10000; //判断 if(NowSpeed>=mSpeed) { Toast.makeText(mContext, "你摇晃了手机!", Toast.LENGTH_SHORT).show(); } } }
- 我要开始摇一摇了
- 我要开始了
- 我要开始发奋了,
- 我要开始努力了
- 我现在要开始了
- 我要开始学习了
- 我要开始记录了!
- 我要开始写了
- 我要开始学韩语了~~
- 我要开始疯狂code了。。。
- 我要开始写Blog了
- 我要开始写blog了
- 我说过了 要重新开始生活
- 我要开始认真学习Linux了!
- 我要开始新的奋斗了
- 我要开始写BLOG了
- 我要开始学习PHP了
- 我要从这里开始了,加油
- 编程之美二 : 中国象棋将帅问题
- iOS添加自定义自体 [UIFont fontWithName: size:](英文有效)
- 采用DECODE方法来进行特殊规则排序
- java Object对象中hashCode和equals方法学习
- Java call by value 和call by reference 的理解
- 我要开始摇一摇了
- HttpServletResponse 找不到
- java JVM内存分析
- 从一个字符串中剔除连续的字符,只留一个。
- matlab循环读写文件、变量
- linux内存参数笔记
- linux中的task_struct结构体
- mac系统还原和更新
- Bagging和RandomForest学习