2014-09-08 5 views
0

Я расскажу вам, что я совершенно не знаком с разработкой Android. Начал эту неделю. До сих пор я знаю только, как делать формы с текстовыми полями/кнопками/такими вещами. Графическое программирование на Android - это voodoo для меня, тем не менее, поэтому я пытаюсь научиться через учебники и пример кода. (который я пробовал просить, прежде чем публиковать этот вопрос, но полностью уничтожен на downvotes, поэтому я попробую этот подход).onSensorChanged(), не требующий датчика гироскопа

Я пытаюсь узнать, как сделать уровень пузыря. Я просмотрел следующий проект в комплекте с исходным кодом: 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 Я предполагаю, что помимо декларации все остальное будет одинаковым между имитированным датчиком и реальным ... верно? Или мне не хватает какой-то реализации для датчика?

Может ли кто-нибудь понять, в чем проблема, которая может быть причиной того, что пузырь не будет там? Я что-то упустил, чтобы заставить датчик работать? Или это совершенно так, что я бы лучше отказаться от этого и попробовать другой пример?

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

} 

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> 
+0

является OnDraw() вызываются? – JoxTraex

+0

@JoxTraex Да, похоже, он звонит в LOT. Я поместил Log.d в функцию onDraw в Board.Java с сообщением «IT DREW», и похоже, что он назывался не менее 20 раз в начале. –

+0

Одна вещь, которую вы должны проверить, - это то, где вырисовывается пузырь, глядя на значения x, y, применяемые к нему. – JoxTraex

ответ

1

Причина это не стреляя, потому что вы не зарегистрировали для обратных вызовов для вашего конкретного вида деятельности при возникновении изменений датчика. См. Здесь http://developer.android.com/reference/android/hardware/SensorManager.html.

Посмотрите на onResume() части образца, обратите внимание, как его регистрация этого (активности), чтобы получать уведомления при изменении, через функцию обратного вызова, предоставляемого интерфейс SensorEventListener