Android onSensorChanged()不调用陀螺仪传感器
在这篇文章的开头,我会说我对安卓开发完全陌生。从这周开始。到目前为止,我只知道如何使用文本框/按钮/诸如此类的东西制作表单。Android中的图形编程对我来说仍然是巫毒,所以我试图通过教程和示例代码来学习。(在发布这个问题之前,我试着问这个问题,但在否决票中彻底失败了,所以我将尝试这种方法) 我正在努力学习如何制作气泡水平仪。我运行了以下项目,包括源代码:。不是真正的教程,但它足够简单,是我开始学习的好地方 我试图先运行它,以确保它能够正常工作,只需很少的修改。我确实必须对SensorProgram.java进行更改,以删除一些出于某种原因似乎不存在的文本视图,还因为该项目在SensorProgram.java中实现了第三方传感器管理器(似乎是通过鼠标控制传感器),并且我打算使用我的实际手机。我用来自的示例声明替换了他的传感器声明。我以为其他一切都是一样的 我的问题是,虽然棋盘画的不错,但泡沫却无处可寻。我可以旋转、翻转和扑通我的手机,任何地方都看不到气泡。就我个人而言,我不知道我的问题是什么。我假设,除了声明之外,模拟传感器和真实传感器之间的其他一切都是一样的。。。正确的?还是我缺少传感器的某种实现 有人能看出是什么问题导致泡沫不存在吗?我是不是错过了让传感器工作的东西?或者它是如此彻底,我会做得更好,放弃这一点,并尝试一个不同的例子 EDIT:查看之后,似乎根本没有触发onsensorChanged()事件om SensorProgram.java。否则,气泡就没有Y值。我在想为什么,现在。。。我编辑了问题的标题以匹配实际问题 下面是我的文件的来源。除了SensorProgram.java之外,它还应该与上面链接中孩子的源代码非常匹配 SensorProgram.javaAndroid onSensorChanged()不调用陀螺仪传感器,android,gyroscope,Android,Gyroscope,在这篇文章的开头,我会说我对安卓开发完全陌生。从这周开始。到目前为止,我只知道如何使用文本框/按钮/诸如此类的东西制作表单。Android中的图形编程对我来说仍然是巫毒,所以我试图通过教程和示例代码来学习。(在发布这个问题之前,我试着问这个问题,但在否决票中彻底失败了,所以我将尝试这种方法) 我正在努力学习如何制作气泡水平仪。我运行了以下项目,包括源代码:。不是真正的教程,但它足够简单,是我开始学习的好地方 我试图先运行它,以确保它能够正常工作,只需很少的修改。我确实必须对SensorProgr
package com.blah.level;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
public class SensorProgram extends Activity implements SensorEventListener
{
private double highAccel, totalAccel;
private SensorManager mSensorManager;
private Sensor mSensor;
private static Context CONTEXT;
private Board b;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
b=new Board(this);
setContentView(b);
CONTEXT = this;
highAccel = 0;
totalAccel = 0;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
public static Context getContext()
{
return CONTEXT;
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1)
{
//Do nothing.
}
@Override
public void onSensorChanged(SensorEvent event) {
b.getBubble().setY(215+(int)(event.values[1]*1.194));
Log.d("SensorChangeEvent", "SENSORCHANGED: " + Float.toString(event.values[1]));
b.invalidate();
}
}
package com.blah.level;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
public class Bubble {
private int x, y, radius;
public Bubble(int xP, int yP, int r)
{
x = xP;
y = yP;
radius = r;
}
public void draw(Canvas c, Paint g)
{
g.setColor(Color.GREEN);
c.drawCircle(x, y, radius, g);
}
public void setY(int newY)
{
y = newY;
Log.d("BubbleY", "BubbleY: " + Integer.toString(y));
}
public void setX(int newX)
{
x = newX;
Log.d("BubbleX", "BubbleX: " + Integer.toString(x));
}
public void setR(int newR)
{
radius = newR;
}
}
package com.blah.level;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.View;
public class Board extends View
{
int _height, _width;
int cX, cY1, cY2, r;
Bubble bubble;
Bitmap _bitmap;
Canvas _canvas;
Paint g;
public Board(Context context)
{
super(context);
g = new Paint();
g.setColor(Color.WHITE);
g.setStyle(Paint.Style.FILL);
bubble = new Bubble(10,50000,0);
}
/**
* Draws the level to the screen. Then draws the bubble on top.
*/
private void drawBoard()
{
g.setColor(Color.BLACK);
_canvas.drawRect(0,0,500,500,g);
g.setColor(Color.WHITE);
_canvas.drawRect(cX-r, cY1, cX+r, cY2, g);//left, top, right, bottom, paint
_canvas.drawCircle(cX, cY1, r, g); //centerX, centerY, radius, paint
_canvas.drawCircle(cX, cY2, r, g);
bubble.draw(_canvas, g);
}
public Bubble getBubble()
{
return bubble;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
_height = View.MeasureSpec.getSize(heightMeasureSpec);
_width = View.MeasureSpec.getSize(widthMeasureSpec);
setMeasuredDimension(_width, _height);
_bitmap = Bitmap.createBitmap(_width, _height, Bitmap.Config.ARGB_8888);
_canvas = new Canvas(_bitmap);
cX = _width/2;
cY1 = _height/4;
cY2 = (_height*3)/4;
r = _width/10;
bubble.setR(r);
bubble.setX(cX);
bubble.setY(cY1);
drawBoard();
}
@Override
protected void onDraw(Canvas canvas) {
drawBoard();
canvas.drawBitmap(_bitmap, 0, 0, g);
//Log.d("onDrawMessage", "IT DREW");
invalidate();
}
}
Bubble.java
package com.blah.level;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
public class SensorProgram extends Activity implements SensorEventListener
{
private double highAccel, totalAccel;
private SensorManager mSensorManager;
private Sensor mSensor;
private static Context CONTEXT;
private Board b;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
b=new Board(this);
setContentView(b);
CONTEXT = this;
highAccel = 0;
totalAccel = 0;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
public static Context getContext()
{
return CONTEXT;
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1)
{
//Do nothing.
}
@Override
public void onSensorChanged(SensorEvent event) {
b.getBubble().setY(215+(int)(event.values[1]*1.194));
Log.d("SensorChangeEvent", "SENSORCHANGED: " + Float.toString(event.values[1]));
b.invalidate();
}
}
package com.blah.level;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
public class Bubble {
private int x, y, radius;
public Bubble(int xP, int yP, int r)
{
x = xP;
y = yP;
radius = r;
}
public void draw(Canvas c, Paint g)
{
g.setColor(Color.GREEN);
c.drawCircle(x, y, radius, g);
}
public void setY(int newY)
{
y = newY;
Log.d("BubbleY", "BubbleY: " + Integer.toString(y));
}
public void setX(int newX)
{
x = newX;
Log.d("BubbleX", "BubbleX: " + Integer.toString(x));
}
public void setR(int newR)
{
radius = newR;
}
}
package com.blah.level;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.View;
public class Board extends View
{
int _height, _width;
int cX, cY1, cY2, r;
Bubble bubble;
Bitmap _bitmap;
Canvas _canvas;
Paint g;
public Board(Context context)
{
super(context);
g = new Paint();
g.setColor(Color.WHITE);
g.setStyle(Paint.Style.FILL);
bubble = new Bubble(10,50000,0);
}
/**
* Draws the level to the screen. Then draws the bubble on top.
*/
private void drawBoard()
{
g.setColor(Color.BLACK);
_canvas.drawRect(0,0,500,500,g);
g.setColor(Color.WHITE);
_canvas.drawRect(cX-r, cY1, cX+r, cY2, g);//left, top, right, bottom, paint
_canvas.drawCircle(cX, cY1, r, g); //centerX, centerY, radius, paint
_canvas.drawCircle(cX, cY2, r, g);
bubble.draw(_canvas, g);
}
public Bubble getBubble()
{
return bubble;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
_height = View.MeasureSpec.getSize(heightMeasureSpec);
_width = View.MeasureSpec.getSize(widthMeasureSpec);
setMeasuredDimension(_width, _height);
_bitmap = Bitmap.createBitmap(_width, _height, Bitmap.Config.ARGB_8888);
_canvas = new Canvas(_bitmap);
cX = _width/2;
cY1 = _height/4;
cY2 = (_height*3)/4;
r = _width/10;
bubble.setR(r);
bubble.setX(cX);
bubble.setY(cY1);
drawBoard();
}
@Override
protected void onDraw(Canvas canvas) {
drawBoard();
canvas.drawBitmap(_bitmap, 0, 0, g);
//Log.d("onDrawMessage", "IT DREW");
invalidate();
}
}
Board.java
package com.blah.level;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
public class SensorProgram extends Activity implements SensorEventListener
{
private double highAccel, totalAccel;
private SensorManager mSensorManager;
private Sensor mSensor;
private static Context CONTEXT;
private Board b;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
b=new Board(this);
setContentView(b);
CONTEXT = this;
highAccel = 0;
totalAccel = 0;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
public static Context getContext()
{
return CONTEXT;
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1)
{
//Do nothing.
}
@Override
public void onSensorChanged(SensorEvent event) {
b.getBubble().setY(215+(int)(event.values[1]*1.194));
Log.d("SensorChangeEvent", "SENSORCHANGED: " + Float.toString(event.values[1]));
b.invalidate();
}
}
package com.blah.level;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
public class Bubble {
private int x, y, radius;
public Bubble(int xP, int yP, int r)
{
x = xP;
y = yP;
radius = r;
}
public void draw(Canvas c, Paint g)
{
g.setColor(Color.GREEN);
c.drawCircle(x, y, radius, g);
}
public void setY(int newY)
{
y = newY;
Log.d("BubbleY", "BubbleY: " + Integer.toString(y));
}
public void setX(int newX)
{
x = newX;
Log.d("BubbleX", "BubbleX: " + Integer.toString(x));
}
public void setR(int newR)
{
radius = newR;
}
}
package com.blah.level;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.View;
public class Board extends View
{
int _height, _width;
int cX, cY1, cY2, r;
Bubble bubble;
Bitmap _bitmap;
Canvas _canvas;
Paint g;
public Board(Context context)
{
super(context);
g = new Paint();
g.setColor(Color.WHITE);
g.setStyle(Paint.Style.FILL);
bubble = new Bubble(10,50000,0);
}
/**
* Draws the level to the screen. Then draws the bubble on top.
*/
private void drawBoard()
{
g.setColor(Color.BLACK);
_canvas.drawRect(0,0,500,500,g);
g.setColor(Color.WHITE);
_canvas.drawRect(cX-r, cY1, cX+r, cY2, g);//left, top, right, bottom, paint
_canvas.drawCircle(cX, cY1, r, g); //centerX, centerY, radius, paint
_canvas.drawCircle(cX, cY2, r, g);
bubble.draw(_canvas, g);
}
public Bubble getBubble()
{
return bubble;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
_height = View.MeasureSpec.getSize(heightMeasureSpec);
_width = View.MeasureSpec.getSize(widthMeasureSpec);
setMeasuredDimension(_width, _height);
_bitmap = Bitmap.createBitmap(_width, _height, Bitmap.Config.ARGB_8888);
_canvas = new Canvas(_bitmap);
cX = _width/2;
cY1 = _height/4;
cY2 = (_height*3)/4;
r = _width/10;
bubble.setR(r);
bubble.setX(cX);
bubble.setY(cY1);
drawBoard();
}
@Override
protected void onDraw(Canvas canvas) {
drawBoard();
canvas.drawBitmap(_bitmap, 0, 0, g);
//Log.d("onDrawMessage", "IT DREW");
invalidate();
}
}
摘自我的清单
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.blah.level"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity android:name="SensorProgram">
<intent-filter >
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
它不触发的原因是,当传感器发生变化时,您没有为给定的活动注册回调。请参阅此处
查看示例的onResume()部分,注意它是如何通过接口SensorEventListener提供的回调来注册此(活动)以在更改时得到通知的,onDraw()是否被调用?@JoxTraex是的,它似乎调用了很多。我在Board.Java的onDraw函数中放了一个Log.d,并显示消息“IT Draw”,它看起来在开始时至少调用了20次。您应该通过查看应用于它的x、y值来验证气泡的绘制位置。需要记住的一点是,您没有在传感器发生变化时重新绘制视图,您只需更改其局部y值,这不会重新绘制视图。也许你应该试着在之后调用invalidate。此外,为了进一步验证,您应该确认正在调用sensorChange。它未触发的原因是,当传感器发生更改时,您没有注册给定活动的回调。请参阅此处。查看示例的onResume()部分,注意它是如何通过接口SensorEventListener提供的回调在发生更改时通知注册此(活动)的。