Android:在方向传感器Y轴(俯仰)上旋转位图时出现问题

Android:在方向传感器Y轴(俯仰)上旋转位图时出现问题,android,bitmap,draw,android-sensors,rotateanimation,Android,Bitmap,Draw,Android Sensors,Rotateanimation,你好,我在这方面急需帮助,我有一个方向盘的图像,我想在手机向左或向右倾斜时旋转它。我的应用程序处于横向模式。您应该看到下面的代码。问题是位图不旋转,并且在不同的位置重新绘制。我找不到这个问题 public class Accelerometer extends Activity { mySteering steering = null; private static SensorManager mySensorManager; private boolean sensorrunning;

你好,我在这方面急需帮助,我有一个方向盘的图像,我想在手机向左或向右倾斜时旋转它。我的应用程序处于横向模式。您应该看到下面的代码。问题是位图不旋转,并且在不同的位置重新绘制。我找不到这个问题

public class Accelerometer extends Activity {

 mySteering steering = null;
 private static SensorManager mySensorManager;
 private boolean sensorrunning;
 public  float y;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       steering = new mySteering(this);

       setContentView(steering);

       mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
       List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);

       if(mySensors.size() > 0){
        mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_NORMAL);
        sensorrunning = true;
        Toast.makeText(this, "Start ORIENTATION Sensor", Toast.LENGTH_LONG).show();
       }
       else{
        Toast.makeText(this, "No ORIENTATION Sensor", Toast.LENGTH_LONG).show();
        sensorrunning = false;
        finish();
       }

   }

   private SensorEventListener mySensorEventListener = new SensorEventListener() {

  @Override
  public void onSensorChanged(SensorEvent event) {
   // TODO Auto-generated method stub


   y = event.values[1];
  }

  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
   // TODO Auto-generated method stub

  }
 };

 @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();

  if(sensorrunning){
   mySensorManager.unregisterListener(mySensorEventListener);
   Toast.makeText(Accelerometer.this, "unregisterListener", Toast.LENGTH_SHORT).show();
  }
 }

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
}

public class mySteering extends View {
    static final int width = 50;
    static final int height = 50;

    Accelerometer sensor = new Accelerometer();
    Matrix rot = new Matrix();

    public mySteering(Context context) {
        super(context);

    }

    protected void onDraw(Canvas canvas) {

        Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                R.drawable.steering);
        Paint p = new Paint(); // set some paint options
        p.setColor(Color.WHITE);

        int canvasWidth = canvas.getWidth();
        int canvasHeight = canvas.getHeight();
        int centreX = (canvasWidth) / 2;

        int centreY = (canvasHeight) / 2;

        canvas.drawText("This is on Y   " + sensor.y, 5, 40, p);



        if (sensor.y <= 12.0 && sensor.y >= -12.0) {


             canvas.drawBitmap(bmp, centreX, centreY, null);
             invalidate();
             }  

        if (sensor.y > 20.0 && sensor.y < 0.0) {

         rot.setRotate(45, centreX, centreY);
         canvas.drawBitmap(bmp, rot, p);
         invalidate();
         } 



         if (sensor.y < -20.0 && sensor.y > 0.0 ) {
             rot.setRotate(-45, centreX, centreY);
             canvas.drawBitmap(bmp, rot, p);
             invalidate();
         }
公共类活动{
mySteering转向=零;
专用静态传感器管理器mySensorManager;
私有布尔运算;
公众浮躁;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
转向=新转向(本);
setContentView(转向);
mySensorManager=(SensorManager)getSystemService(Context.SENSOR\u SERVICE);
List mySensors=mySensorManager.getSensorList(Sensor.TYPE_方向);
如果(mySensors.size()>0){
mySensorManager.registerListener(mysensorreventListener、mySensors.get(0)、SensorManager.SENSOR\u DELAY\u NORMAL);
sensorrunning=true;
Toast.makeText(这是“开始方向传感器”,Toast.LENGTH_LONG.show();
}
否则{
Toast.makeText(这是“无方向传感器”,Toast.LENGTH_LONG).show();
sensorrunning=false;
完成();
}
}
私有SensorEventListener mySensorEventListener=新的SensorEventListener(){
@凌驾
传感器更改时的公共无效(传感器事件){
//TODO自动生成的方法存根
y=事件值[1];
}
@凌驾
精度更改时的公共无效(传感器,int精度){
//TODO自动生成的方法存根
}
};
@凌驾
受保护的空onDestroy(){
//TODO自动生成的方法存根
super.ondestory();
如果(传感器正在运行){
mySensorManager.unregisterListener(mySensorEventListener);
Toast.makeText(accelerator.this,“unregisterListener”,Toast.LENGTH_SHORT.show();
}
}
@凌驾
受保护的void onStart(){
//TODO自动生成的方法存根
super.onStart();
}
公共类mySteering扩展了视图{
静态最终整数宽度=50;
静态最终内部高度=50;
加速计传感器=新加速计();
矩阵rot=新矩阵();
公共mySteering(上下文){
超级(上下文);
}
受保护的void onDraw(画布){
位图bmp=BitmapFactory.decodeResource(getResources(),
R.可牵引转向);
Paint p=new Paint();//设置一些绘制选项
p、 setColor(Color.WHITE);
int canvasWidth=canvas.getWidth();
int canvasHeight=canvas.getHeight();
int centreX=(画布宽度)/2;
int centreY=(画布高度)/2;
画布.drawText(“这是在Y上”+传感器.Y,5,40,p);
如果(传感器y=-12.0){
drawBitmap(bmp、centreX、centreY、null);
使无效();
}  
如果(传感器y>20.0和传感器y<0.0){
rot.setRotate(45,centreX,centreY);
绘制位图(bmp,rot,p);
使无效();
} 
如果(传感器y<-20.0和传感器y>0.0){
rot.setRotate(-45,centreX,centreY);
绘制位图(bmp,rot,p);
使无效();
}
有人能找出或修改代码中的错误吗?提前谢谢。 这就是它这次看起来的样子,没有旋转,甚至没有重新绘制


您可能必须按如下方式传递传感器值:

 public void onSensorChanged(SensorEvent event) {
   // TODO Auto-generated method stub

   steering.sensor = this;
   y = event.values[1];
   steering.invalidate();
  }

使用parameter sensor将public void中的steering.sensor设置为AccuracyChanged(sensor sensor,int Accurance)方法,并在那里使转向无效。很抱歉,我没有理解您所说的内容。类型不匹配:无法从新的SensorEventListener()转换{}要使用加速度计,请尝试以下操作:-steering.sensor=Accelerator。这;感谢它可以工作,但当方向盘旋转到if语句上的给定角度时,另一个问题仍然存在,它会在不同的位置上重新绘制。如何在相同的位置旋转位图,而不让它一次又一次地绘制?pro我看到的问题是,我的centreX和centerY在旋转时不断变化。我应该如何修复它们,并在屏幕中心绘制位图,而不考虑传感器?