Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onSensorChanged()不调用陀螺仪传感器_Android_Gyroscope - Fatal编程技术网

Android onSensorChanged()不调用陀螺仪传感器

Android onSensorChanged()不调用陀螺仪传感器,android,gyroscope,Android,Gyroscope,在这篇文章的开头,我会说我对安卓开发完全陌生。从这周开始。到目前为止,我只知道如何使用文本框/按钮/诸如此类的东西制作表单。Android中的图形编程对我来说仍然是巫毒,所以我试图通过教程和示例代码来学习。(在发布这个问题之前,我试着问这个问题,但在否决票中彻底失败了,所以我将尝试这种方法) 我正在努力学习如何制作气泡水平仪。我运行了以下项目,包括源代码:。不是真正的教程,但它足够简单,是我开始学习的好地方 我试图先运行它,以确保它能够正常工作,只需很少的修改。我确实必须对SensorProgr

在这篇文章的开头,我会说我对安卓开发完全陌生。从这周开始。到目前为止,我只知道如何使用文本框/按钮/诸如此类的东西制作表单。Android中的图形编程对我来说仍然是巫毒,所以我试图通过教程和示例代码来学习。(在发布这个问题之前,我试着问这个问题,但在否决票中彻底失败了,所以我将尝试这种方法)

我正在努力学习如何制作气泡水平仪。我运行了以下项目,包括源代码:。不是真正的教程,但它足够简单,是我开始学习的好地方

我试图先运行它,以确保它能够正常工作,只需很少的修改。我确实必须对SensorProgram.java进行更改,以删除一些出于某种原因似乎不存在的文本视图,还因为该项目在SensorProgram.java中实现了第三方传感器管理器(似乎是通过鼠标控制传感器),并且我打算使用我的实际手机。我用来自的示例声明替换了他的传感器声明。我以为其他一切都是一样的

我的问题是,虽然棋盘画的不错,但泡沫却无处可寻。我可以旋转、翻转和扑通我的手机,任何地方都看不到气泡。就我个人而言,我不知道我的问题是什么。我假设,除了声明之外,模拟传感器和真实传感器之间的其他一切都是一样的。。。正确的?还是我缺少传感器的某种实现

有人能看出是什么问题导致泡沫不存在吗?我是不是错过了让传感器工作的东西?或者它是如此彻底,我会做得更好,放弃这一点,并尝试一个不同的例子

EDIT:查看之后,似乎根本没有触发onsensorChanged()事件om SensorProgram.java。否则,气泡就没有Y值。我在想为什么,现在。。。我编辑了问题的标题以匹配实际问题

下面是我的文件的来源。除了SensorProgram.java之外,它还应该与上面链接中孩子的源代码非常匹配

SensorProgram.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();
        }
}
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提供的回调在发生更改时通知注册此(活动)的。