我已经阅读了很多代码,但我不明白如何使用加速计传感器来移动图像,我理解如何注册它但我不明白如何实际制作图像或形状绘制移动与加速度计轴同步,我使用android java来做到这一点。因为我真的在苦苦挣扎,有人可以帮助我。感谢您的时间和帮助。
答案 0 :(得分:1)
所以,这是注册一个监听器的代码(我知道你说你已经完成了这个,但它永远不会受到伤害):
private void enableAccelerometerListening() {
sensorManager = (SensorManager) getSystemService(COntext.SENSOR_SERVICE);
sensorManager.registerListener(sensorEventListener), sensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
private void disableAccelerometerListening() {
if (sensorManager != null) {
sesnsorManager.unregisterListener(sensorEVentListener, sensorManager.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER));
sensorManager = null;
}}
您的班级声明下方需要几个字段:
private SesnsorManager sensorManager;
private float acceleration;
private float currentAcceleration;
private float lastAcceleration;
private static final int ACCELERATION_THRESHOLD = 15000;
这是事件处理程序,它非常接近你需要的帮助:
private SensorEventListener sensorEventListener = new SensorEventListener() {
public void onSesnsorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
lastAcceleration = currentAcceleration; //save previous accel value
currentAcceleration = x*x + y*y + z*z;
acceleration = currentAcceleration * (currentAcceleration - lastAcceleration); // calc the change in acceleration
//if the accel is above a certain threshold:
if (acceleration > ACCELERATION_THRESHOLD) {
//MAKE YOUR CODE HERE THAT RESPONDS TO ACCELERATION EVENTS
//Note, your accel threshold should be determined by trial and error on a number of devices
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy {}
};
答案 1 :(得分:0)
另外,我会尝试解决你的一些动画需求,尽管我在这方面更加不稳定。我想你需要做的就是在加速度计检测到移动时让你的图像移动。图像必须通过动画移动,而不是直接移动加速度计。所以说'现货'是你的形象,好吗? (下面的代码都添加了一个点并设置了它的动画(它们没有直接与加速度计相关联,但我希望这仍然有用):
public void addSpot() {
int x = random.nextInt(viewWidth - SPOT_DIAMETER);
int y = random.nextInt(viewHeight = SPOT_DIAMETER);
int x2 = random.nextInt(viewWidth - SPOT_DIAMETER);
int y2 = random.nextInt(viewWidth - SPOT_DIAMETER);
final ImageView spot = (ImageView) layoutFinlater.inflate(R.layout.untouched, null);
spot.setLayoutParams(new RelativeLayout.LayoutParams(SPOT_DIAMETER, SPOT_DIAMETER));
spot.setX(x);
spot.setY(y);
就在这里,我认为你可以开始用加速度计事件做点什么......
正如您在上面的其他回复中看到的那样,
if (acceleration > ACCELERATION_THRESHOLD) {
spot.animate().x(x2).y(y2).setDuration(animationTime);
animationTime只是你觉得合适的毫秒时间,并且不要忘记导入必要的包。