onSensorChanged()不要求使用陀螺仪传感器

时间:2014-09-08 00:45:48

标签: android gyroscope

我将在前言中说我对Android开发完全陌生。本周开始有点事。到目前为止,我只知道如何用文本框/按钮/那种方式做表单。 Android中的图形编程仍然是巫术,所以我正在尝试通过教程和示例代码学习。 (我在发布这个问题之前尝试过要求,但在downvotes上完全被破坏了,所以我会尝试这种方法)。

我正在努力学习如何制作泡泡水平。我跑过了以下项目,完成了源代码:http://www.intuitor.com/student/Android%20Phone%20Site/Jean1Android.php。这不是一个教程,但它很简单,可以成为我开始的好地方。

我首先尝试运行它,以确保它可以工作,只需要很少的修改。我确实需要对SensorProgram.java进行更改以删除一些由于某种原因似乎不存在的TextView,并且还因为该项目实现了第三方传感器管理器(用于通过鼠标控制传感器,似乎) SensorProgram.java,我打算用我的实际手机。我用http://developer.android.com/guide/topics/sensors/sensors_motion.html的示例声明替换了他的传感器声明。我认为其他一切都是一样的。

我的问题是,当电路板拉好时,泡沫无处可寻。我可以旋转,翻转和翻转我的手机,任何地方都没有气泡。对于我的生活,我无法弄清楚我的问题是什么。 0_o我认为,除了声明之外,模拟传感器和真实传感器之间的其他一切都是相同的...对吗?或者我错过了传感器的某种实现方式?

任何人都可以看到可能导致泡沫不存在的问题是什么?我错过了让传感器工作的东西吗?或者它是如此彻底,我会更好地废弃这个并尝试一个不同的例子?

编辑:经过一番观察后,似乎传感器上的onsensorChanged()事件根本没有触发。没有它,泡沫就没有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();
        }

}

Bubble.java

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;
        }
}

Board.java

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>

1 个答案:

答案 0 :(得分:1)

它没有被触发的原因是因为当传感器发生变化时你没有注册给定活动的回调。请参阅此处http://developer.android.com/reference/android/hardware/SensorManager.html

查看示例的onResume()部分,注意如何通过SensorEventListener接口提供的回调来注册它(Activity)以便在更改时得到通知