我已经阅读了关于访问手机加速度计(加速度和方向)值的文章/教程.我正在尝试构建一个简单的应用程序,我可以使用这些值移动球形图像.这是我的代码:
import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class Accelerometer extends Activity implements SensorEventListener { /** Called when the activity is first created. */ CustomDrawableView mCustomDrawableView = null; ShapeDrawable mDrawable = new ShapeDrawable(); int x ; int y ; private SensorManager sensorManager = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get a reference to a SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); mCustomDrawableView = new CustomDrawableView(this); setContentView(mCustomDrawableView); // setContentView(R.layout.main); } // This method will update the UI on new sensor events public void onSensorChanged(SensorEvent sensorEvent) { { if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { int someNumber = 100; float xChange = someNumber * sensorEvent.values[1]; //values[2] can be -90 to 90 float yChange = someNumber * 2 * sensorEvent.values[2]; x = x + (int)xChange; y = y + (int)yChange; } if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) { } } } // I've chosen to not implement this method public void onAccuracyChanged(Sensor arg0,int arg1) { // TODO Auto-generated method stub } @Override protected void onResume() { super.onResume(); // Register this class as a listener for the accelerometer sensor sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL); // ...and the orientation sensor sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onStop() { // Unregister the listener sensorManager.unregisterListener(this); super.onStop(); } public class CustomDrawableView extends View { public CustomDrawableView(Context context) { super(context); int width = 50; int height = 50; mDrawable = new ShapeDrawable(new OvalShape()); mDrawable.getPaint().setColor(0xff74AC23); mDrawable.setBounds(x,y,x + width,y + height); } protected void onDraw(Canvas canvas) { mDrawable.draw(canvas); invalidate(); } } }
我在屏幕上显示椭圆形,但没有发生任何事情.
谢谢
解决方法
使用此代码.在你开始这个课程之后,你从来没有设置可绘制的位置.你必须做一些计算来正确设置球的位置.你这样做的方式是获得超过10000的值,这是画出椭圆形的屏幕.
import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.View; public class Accelerometer extends Activity implements SensorEventListener { /** Called when the activity is first created. */ CustomDrawableView mCustomDrawableView = null; ShapeDrawable mDrawable = new ShapeDrawable(); public static int x; public static int y; private SensorManager sensorManager = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get a reference to a SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); mCustomDrawableView = new CustomDrawableView(this); setContentView(mCustomDrawableView); // setContentView(R.layout.main); } // This method will update the UI on new sensor events public void onSensorChanged(SensorEvent sensorEvent) { { if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { // the values you were calculating originally here were over 10000! x = (int) Math.pow(sensorEvent.values[1],2); y = (int) Math.pow(sensorEvent.values[2],2); } if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) { } } } // I've chosen to not implement this method public void onAccuracyChanged(Sensor arg0,int arg1) { // TODO Auto-generated method stub } @Override protected void onResume() { super.onResume(); // Register this class as a listener for the accelerometer sensor sensorManager.registerListener(this,SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onStop() { // Unregister the listener sensorManager.unregisterListener(this); super.onStop(); } public class CustomDrawableView extends View { static final int width = 50; static final int height = 50; public CustomDrawableView(Context context) { super(context); mDrawable = new ShapeDrawable(new OvalShape()); mDrawable.getPaint().setColor(0xff74AC23); mDrawable.setBounds(x,y + height); } protected void onDraw(Canvas canvas) { RectF oval = new RectF(Accelerometer.x,Accelerometer.y,Accelerometer.x + width,Accelerometer.y + height); // set bounds of rectangle Paint p = new Paint(); // set some paint options p.setColor(Color.BLUE); canvas.drawOval(oval,p); invalidate(); } } }