第一篇,摇一摇功能的实现
目录
第一篇,摇一摇功能的实现
一直想,我要写的第一篇技术博客是什么,应该也别有意义吧。
也想毕业后,才有时间慢慢写博客的,做开源的,才能学多点,看到我的栏目很多,漫无目的
其实很多想法,暂时都不能实现,想做创新的东西,改变思维的东西,但是仍需要慢慢积累技术,下次有时间有灵感再慢慢道出
在CSDN混久了,默默的,还是喜欢移动开发,但没钱iOS,只能多做Android,面试问到eoe,还是多上eoe打怪升级吧
这次只是匆匆写下今天做的,也算记录吧,其实也不是我写的,eoe论坛抄的,其实还有蒋雨捷的好像HTML5实现没试过,纯记录分享下:
听说微信摇一摇功能是由实习生写的,面试两次微信,被鄙视了
这个摇一摇只是简单的Android一个类实现,应该还有优化之类,不能做到微信样
程序员就话不多说了,贴代码:
package com.myth.skyh;
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 = 3000;
// 两次检测的时间间隔
private static final int UPTATE_INTERVAL_TIME = 100;
// 传感器管理器
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;
Log.v("thelog", "===========log===================");
// 达到速度阀值,发出提示
if (speed >= SPEED_SHRESHOLD) {
onShakeListener.onShake();
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
// 摇晃监听接口
public interface OnShakeListener {
public void onShake();
}
}
很简单吧,继承传感器SensorEventListener类,每一段时间监听,设置阙值,时间内动作幅度大于阙值就摇一摇了。
还有实现:
package com.myth.skyh;
import java.util.ArrayList;
import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.myth.skyh.ShakeListener.OnShakeListener;
public class ShackActivity extends Activity {
ShakeListener mShakeListener = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 不显示程序的标题栏
setContentView(R.layout.main);
mShakeListener = new ShakeListener(this);
setListeners();
}
private void setListeners() {
mShakeListener.setOnShakeListener(new OnShakeListener() {
public void onShake() {
Toast.makeText(ShackActivity.this, "You shake", Toast.LENGTH_LONG).show();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mShakeListener.stop();
}
}
直接贴上就可以了。