2012-06-14 4 views
0

장치가 회전하는 각도를 알려주는 응용 프로그램을 만들려고합니다. 각도 또는 라디안으로 결과를 보려면 옵션을 제공하는 메뉴가 있지만이 코드 만 실행하면 레이아웃을 보여주는 장치 아무것도 회전하지에 내 머리 위로 떨어져 미리각도 회전 감지 장치

package com.example.directordetector; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mInitialized = false; 
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mAccelerometer = mSensorManager 
      .getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); 
    mSensorManager.registerListener(this, mAccelerometer, 
      SensorManager.SENSOR_DELAY_NORMAL); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_name, menu); 
    return true; 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.degree: 
     m = 0; 
     return true; 
    case R.id.radian: 
     m = 1; 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 

    } 

} 

protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, mAccelerometer, 
      SensorManager.SENSOR_DELAY_NORMAL); 
} 

protected void onPause() { 
    super.onPause(); 
    mSensorManager.unregisterListener(this); 
} 

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

} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    // TODO Auto-generated method stub 
    TextView tvX = (TextView) findViewById(R.id.x_axis); 
    TextView tvY = (TextView) findViewById(R.id.y_axis); 
    TextView tvZ = (TextView) findViewById(R.id.z_axis); 
    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 
    if (!mInitialized) { 
     mLastX = x; 
     mLastY = y; 
     mLastZ = z; 
     tvX.setText("0.0"); 
     tvY.setText("0.0"); 
     tvZ.setText("0.0"); 
     mInitialized = true; 
    } else { 
     float deltaX = Math.abs(mLastX - x); 
     float deltaY = Math.abs(mLastY - y); 
     float deltaZ = Math.abs(mLastZ - z); 
     if (deltaX < NOISE) 
      deltaX = (float) 0.0; 

     if (deltaY < NOISE) 
      deltaY = (float) 0.0; 

     if (deltaZ < NOISE) 
      deltaZ = (float) 0.0; 
     mLastX = x; 
     mLastY = y; 
     mLastZ = z; 
     if (m == 1) { 

      deltaX = (float) (deltaX * (3.18/180)); 
      deltaX = (float) (deltaX * (3.18/180)); 
      deltaX = (float) (deltaX * (3.18/180)); 
     } 

     tvX.setText(Float.toString(deltaX)); 
     tvY.setText(Float.toString(deltaY)); 
     tvZ.setText(Float.toString(deltaZ)); 

    } 

} 
} 

답변

0

메신저 잘못 고맙습니다 나는 그것이 작동하지 않는 이유를 말할 수있는 말해 plzz 일어나고 등장하고있다. 하지만 findViewById() 호출을 센서 수신기 콜백 안에 두지 않도록 제안합니다. 이 방법은 상당히 비싸고 센서 콜백은 많은 통화를 수신하게됩니다.

활동에 조회수를 선언하고 다음과 같이()에서 onCreate에 그것들을 초기화 :

TextView tvX; 
TextView tvY; 
TextView tvZ; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    tvX = (TextView) findViewById(R.id.x_axis); 
    tvY = (TextView) findViewById(R.id.y_axis); 
    tvZ = (TextView) findViewById(R.id.z_axis); 
    ... 
} 

한 번만) findViewById를을 (호출하는 그런 식으로, 당신은 항상 당신의 참조를 사용할 수 있습니다 TextViews에서 텍스트를 변경하십시오.

지금 가지고있는 것을 실행하면 정확히 어떤 일이 발생합니까? TextViews가 "0.0"으로 설정되고 그대로 유지됩니까? 아니면 전혀 설정하지 않습니까? 당신이 움직임을 감지 할 수 있습니다 - 회전 잘못된 센서되어

그리고 가속도계 :

+0

전혀 설정되지 않았습니다 –

0

같이 findViewById() 메소드가 (https://github.com/ko5tik/andject 나는 또한 은보기와 다른 thingies에 대한 의존성 주입을 수행 할 작은 도서관을 썼다))에서 onCreate (에 속하는 또는 기울어지기는하지만 장치 축 중 하나를 회전시키지 않아야합니다. 이것을 위해 자장 센서를 사용하십시오

+0

왜 GravitySensor를 사용하지 않습니까? –

+0

회전 정보를 제공하지 않습니다. 장치의 가속 방향 만. –

+0

가속도계에 회전 각도가 표시되지 않습니다. 내 장치가 회전 된 각도를 의미합니다. ?? –