Я расскажу вам, что я совершенно не знаком с разработкой 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>
является OnDraw() вызываются? – JoxTraex
@JoxTraex Да, похоже, он звонит в LOT. Я поместил Log.d в функцию onDraw в Board.Java с сообщением «IT DREW», и похоже, что он назывался не менее 20 раз в начале. –
Одна вещь, которую вы должны проверить, - это то, где вырисовывается пузырь, глядя на значения x, y, применяемые к нему. – JoxTraex