关门变量
来源:互联网 发布:亨利 知乎 编辑:程序博客网 时间:2024/04/30 23:03
今天要写一个检测手机震动的android程序,刚开始竟然不知到怎么写,后来来来回回跳了一天,最后还是用了一个很简单的方法便解决了。咳坑爹的是最后发现是自己传感器的问题他娘的啊。
写传感器的程序无非就是重载onSensorChanged这个方法。这个方法应该是被一个线程(当然不是主线程)一直在监听,如果有数值改变的事件发生,那么便响应这个方法。那么手机晃动的程序该怎么写呢?很简单啊,粗糙的方法只需要判断这个xyz各个方向上的加速值是不是达到了某一哥边界就可以了。我取得边界掷是15,如果能达到便是震动的。
但关键是这个方法是在不断监听的,我们的目地是检测到手机晃动然后执行一个动画。但是现在加速度只要有一点变化,那么就会重新执行那个动画,这当然不服和我们的意愿,因为我们希望的是在执行动画的过程中不再去触发那个事件。那么怎么做呢?其实这个思想我们见过的,还记得操作系统中的信号量机制吗?对就是互斥思想,我们只需要设置一个guard,一旦进去之后就必须得把门关住了,这就好比上厕所,上的时候关上门,等你拉完屎后,再把门打开,让别人上厕所。就是这么简单,但是我之所以跳了一天是因为我的传感器怀了好像~!!!!!!
下面摘一段程序,是微信的摇一摇便知道几个好友在线的程序,也是基于这种思想的:
package boke.sensor.yao;
import com.se.yao.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class SeActivity extends Activity {
SensorManager sm;
SensorL listener;
private boolean isRefresh=false;
Dialog d;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
listener = new SensorL();
// 对加速计进行监听
sm.registerListener(listener, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST);
// sm.registerListener(listener,
// sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST);
// sm.registerListener(listener,sm.getDefaultSensor(Sensor.TYPE_PRESSURE),SensorManager.SENSOR_DELAY_FASTEST);
AlertDialog.Builder b = new Builder(this);
// 用来显示的对话框
d = b.setPositiveButton("ok", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
isRefresh = false;
dialog.cancel();
}
}).setMessage("摇到了.................").create();
}
private class SensorL implements SensorEventListener {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// 判断是否在刷新
if (isRefresh)
return;
float newX = Math.abs(event.values[SensorManager.DATA_X]);
float newY = Math.abs(event.values[SensorManager.DATA_Y]);
float newZ = Math.abs(event.values[SensorManager.DATA_Z]);
// 这里是关键,判断某个方向上的加速度值是否达到自己想要的值
// X
if (newX >= 18) {
Toast.makeText(SeActivity.this, "newX" + newX, 0).show();
isRefresh = true;
d.show();
return;
}
// Y
if (newY >= 20) {
Toast.makeText(SeActivity.this, "newY" + newY, 0).show();
isRefresh = true;
d.show();
return;
}
// Z
if (newZ >= 20) {
Toast.makeText(SeActivity.this, "newZ" + newZ, 0).show();
isRefresh = true;
d.show();
return;
}
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
// Log.e("TYPE_MAGNETIC_FIELD", ""+event.sensor.toString());
}
if (event.sensor.getType() == Sensor.TYPE_PRESSURE) {
// Log.e("TYPE_PRESSURE", ""+event.sensor.toString());
}
}
}
@Override
protected void onPause() {
// ACTIVITY消失时取消监听
sm.unregisterListener(listener);
super.onPause();
}
}
- 关门变量
- 开门关门
- 软件公司怎么关门的
- Flex:开门关门特效
- 微软live space 关门
- hdoj1234开门关门
- 美国政府关门会怎样?
- 小结一下“鹿关门”
- 听月轩和水库关门了
- 连卖饭的都关门了。。。
- 有一种尊重,叫晚三秒再关门
- 房子模型开门、关门操作
- 科技园又有餐厅关门了
- NFC关门开锁,你值得拥有
- 店铺关门风波需要权力自我反思
- 地狱不会因为下雨天就关门
- Door Man——单笔画关门
- 美国政府关门再也唬不住华尔街
- android开机默认中文的方法
- 简单高级搜索页面的简单实现,包括数据控件循环嵌套,DataTable动态生成数据添加等
- 奇怪的错误!
- 异步post例子(Meal4me登陆)
- 怎么解除任务管理器锁?
- 关门变量
- linux命令记录
- 小记事本
- 右键新建记事本没有了解决办法
- 离线配置Android开发环境
- 无法破解的密码:将30个随机字符密码植入你的潜意识
- Hibernate4实战 之 第一部分 Hibernate入门
- 【iphone游戏开发】iphone-Cocos2d游戏开发之四:精灵实现缩放,旋转,跳动,移动等动画
- DM644x达芬奇平台交叉编译工具链的制作