首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我试着在感官改变的时候打球。

我试着在感官改变的时候打球。
EN

Stack Overflow用户
提问于 2015-04-14 13:57:49
回答 1查看 93关注 0票数 0

下面的代码我用来获取传感器变化的x,y值。基于此,我正在尝试移动屏幕上的球。

代码语言:javascript
复制
     private SensorManager sensorMgr;
     @SuppressWarnings("unused")
     private TextView accuracyLabel;
     private TextView xLabel, yLabel, zLabel;
     private Button calibrateButton;
     public int mScrWidth,mScrHeight,wh,hgt;
     public float x, y, z;

     // deltas for calibration
     private float cx, cy, cz;

     private long lastUpdate = -1;
     public float mSpdx;
     public float mSpdy;
     public CollisionSurface cf=null;


     @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        xLabel = (TextView) findViewById(R.id.textView1);
        yLabel = (TextView) findViewById(R.id.textView2);
        zLabel = (TextView) findViewById(R.id.textView3);
        sensorMgr= (SensorManager) getSystemService(SENSOR_SERVICE);
        lastUpdate = System.currentTimeMillis();


          Point size = new Point();
        WindowManager w = getWindowManager();

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)    {
            w.getDefaultDisplay().getSize(size);
          wh =  mScrWidth = size.x;

          hgt = mScrHeight = size.y; 
        }else{
            Display d = w.getDefaultDisplay(); 
          wh=  mScrWidth = d.getWidth(); 

          xLabel.setText(""+wh);  


        } 

        /*        ((SensorManager)getSystemService(Context.SENSOR_SERVICE)).registerListener(
       new SensorEventListener() {    
        @Override  
        public void onSensorChanged(SensorEvent event) {  
           //set ball speed based on phone tilt (ignore Z axis)
         mSpdx = event.values[1];
         mSpdy = event.values[0];
         //timer event will redraw ball
        }
               @Override  
           public void onAccuracyChanged(Sensor sensor, int accuracy) {} //ignore this event
          },
          ((SensorManager)getSystemService(Context.SENSOR_SERVICE))
          .getSensorList(Sensor.TYPE_ACCELEROMETER).get(o), SensorManager.SENSOR_DELAY_GAME);

      */

         cf=new CollisionSurface(this.getApplicationContext());
        setContentView(cf);


    }

     @Override
     public void onClick(View v) {
      // TODO Auto-generated method stub

     }

     @Override
     protected void onPause() {
      super.onPause();

      sensorMgr.unregisterListener(this, SENSOR_ACCELEROMETER);
      sensorMgr = null;

      cx = 0;
      cy = 0;
      cz = 0;
     }

     @SuppressWarnings("deprecation")
     @Override
     protected void onResume() {
  super.onResume();
  sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);

   sensorMgr.registerListener(this, sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                 SensorManager.SENSOR_DELAY_NORMAL);
         // ...and the orientation sensor
       boolean accelSupported = sensorMgr.registerListener(this, SENSOR_ACCELEROMETER,SENSOR_DELAY_UI);

  if (!accelSupported) {
   // on accelerometer on this device
   sensorMgr.unregisterListener(this, SENSOR_ACCELEROMETER);
   //accuracyLabel.setText(R.string.no_accelerometer);
  }
 }

 // from the android.hardware.SensorListener interface
 public void onAccuracyChanged(int sensor, int accuracy) {
  // this method is called very rarely, so we don't have to
  // limit our updates as we do in onSensorChanged(...)
  if (sensor == SENSOR_ACCELEROMETER) {
   switch (accuracy) {
   case SENSOR_STATUS_UNRELIABLE:
    //accuracyLabel.setText(R.string.accuracy_unreliable);
    break;
   case SENSOR_STATUS_ACCURACY_LOW:
    //accuracyLabel.setText(R.string.accuracy_low);
    break;
   case SENSOR_STATUS_ACCURACY_MEDIUM:
    //accuracyLabel.setText(R.string.accuracy_medium);
    break;
   case SENSOR_STATUS_ACCURACY_HIGH:
    //accuracyLabel.setText(R.string.accuracy_high);
    break;
   }
  }
 }


 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) {

            }
        }
    }

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

 }

 @Override
 public void onSensorChanged(int sensor, float[] values) {
  // TODO Auto-generated method stub
  if (sensor == SENSOR_ACCELEROMETER) {
   long curTime = System.currentTimeMillis();
   // only allow one update every 100ms, otherwise updates
   // come way too fast and the phone gets bogged down
   // with garbage collection
   if (lastUpdate == -1 || (curTime - lastUpdate) > 100) {
    lastUpdate = curTime;

    x = values[DATA_X];
    y = values[DATA_Y];
    z = values[DATA_Z];

   // xLabel.setText(String.format("X: %+2.5f (%+2.5f)", (x+cx), cx));
   // yLabel.setText(String.format("Y: %+2.5f (%+2.5f)", (y+cy), cy));
   // zLabel.setText(String.format("Z: %+2.5f (%+2.5f)", (z+cz), cz));
     }
     }
     }

我不能得到x,y,z值在手机的倾斜..我需要做哪些更改..

EN

回答 1

Stack Overflow用户

发布于 2015-04-14 15:12:01

尝尝这个

代码语言:javascript
复制
public class MainActivity extends Activity  implements SensorEventListener{

        // deltas for calibration
        private float cx, cy, cz;
        private int SENSOR_ACCELEROMETER = Sensor.TYPE_ACCELEROMETER;
        private SensorManager sensorMgr;
        @SuppressWarnings("unused")
        private TextView accuracyLabel;
        private TextView xLabel, yLabel, zLabel;
        private Button calibrateButton;
        public int mScrWidth, mScrHeight, wh, hgt;
        public float x, y, z;
        float lastUpdate;

        @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            lastUpdate = System.currentTimeMillis();

            Point size = new Point();
            WindowManager w = getWindowManager();

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                w.getDefaultDisplay().getSize(size);
                wh = mScrWidth = size.x;

                hgt = mScrHeight = size.y;
            } else {
                Display d = w.getDefaultDisplay();
                wh = mScrWidth = d.getWidth();

                xLabel.setText("" + wh);

            }

            /*
             * ((SensorManager)getSystemService(Context.SENSOR_SERVICE)).
             * registerListener( new SensorEventListener() {
             * 
             * @Override public void onSensorChanged(SensorEvent event) { //set ball
             * speed based on phone tilt (ignore Z axis) mSpdx = event.values[1];
             * mSpdy = event.values[0]; //timer event will redraw ball }
             * 
             * @Override public void onAccuracyChanged(Sensor sensor, int accuracy)
             * {} //ignore this event },
             * ((SensorManager)getSystemService(Context.SENSOR_SERVICE))
             * .getSensorList(Sensor.TYPE_ACCELEROMETER).get(o),
             * SensorManager.SENSOR_DELAY_GAME);
             */

        }

        @Override
        protected void onPause() {
            super.onPause();

            if (sensorMgr.getDefaultSensor(SENSOR_ACCELEROMETER) != null) {
                sensorMgr.unregisterListener(this);
                sensorMgr = null;
            }

            cx = 0;
            cy = 0;
            cz = 0;
        }

        @Override
        protected void onResume() {
            super.onResume();
            sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);

            // ...and the orientation sensor


            if (sensorMgr.getDefaultSensor(SENSOR_ACCELEROMETER) != null) {
                sensorMgr.registerListener(this,
                        sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                        SensorManager.SENSOR_DELAY_NORMAL);
            }
        }


        public void onSensorChanged(SensorEvent sensorEvent) {
                if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                    // the values you were calculating originally here were over
                    // 10000!
                    x = sensorEvent.values[0];
                    y = sensorEvent.values[1];

                    System.out.println(x);
                    System.out.println(y);
                    System.out.println(sensorEvent.values[2]);
                }           
        }



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

        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29620115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档