2011-04-14 2 views
0

나는 내 자신의 버전의 api 예제를 만들고 있습니다. (http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Compass.html) 나침반을 만들 수 있습니다. 내 코드와 api 예제의 유일한 차이점은 sensorEventListener가 imageView 자체가 아닌 활동에 만들어 졌다는 점입니다. 그게 왜 sensorEventListener가 작동하지 않는 원인이 될 수 있습니까? 위젯은 작동하지만 OnSensorChanged 만 호출되지 않습니다.CompassListener In Imageview

내 사용자 정의 위젯 클래스 :

package be.helloworld.widgets; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.util.AttributeSet; 
import android.util.Config; 
import android.util.Log; 
import android.widget.ImageView; 

public class Compass extends ImageView{ 
    private static final String TAG = "Compass"; 

    private SensorManager mSensorManager; 
    private Sensor mSensor; 
    // private SampleView mView; 
    private float[] mValues; 

    private final SensorEventListener mListener = new SensorEventListener() { 
     public void onSensorChanged(SensorEvent event) { 
      if (Config.DEBUG) Log.d(TAG, "sensorChanged (" + event.values[0] + ", " + event.values[1] + ", " + event.values[2] + ")"); 
      mValues = event.values; 
      /* if (mView != null) { 
       mView.invalidate(); 
      }*/ 
      invalidate(); 
     } 

     public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     } 
    }; 




    public CarPassCompass(Context context) { 
     super(context); 
     initSensor(context); 


    } 

    public CarPassCompass(Context context, AttributeSet set)  { 
     super(context, set); 
     initSensor(context); 
    } 

    public void initSensor(Context context) { 
     mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 
     mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); 
      /*mView = new SampleView(this); 
      setContentView(mView);*/ 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     int w = canvas.getWidth(); 
     int h = canvas.getHeight(); 
     int cx = w/2; 
     int cy = h/2; 

     canvas.translate(cx, cy); 
     if (mValues != null) { 
      canvas.rotate(-mValues[0]); 
     } 
    } 



} 

내 XML 파일 : 원인 안

<be.helloworld.widgets.Compass 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/kompas_arrow" 
    /> 

답변

1

. 난 당신의 코드에서 볼 수없는 한 가지 중요한 라인은 다음과 같습니다

또한
mSensorManager.registerListener(mListener, SensorManager.SENSOR_ORIENTATION, SensorManager.SENSOR_DELAY_GAME); 

이뿐만 아니라 그 등록을 취소하는 것을 잊지 마세요. onResume()/onStop() 쌍에 넣어야합니다.

+0

예. 분명히 감사합니다. 이제 onDraw 메서드에서 올바른 값을 얻습니다. 캔버스 만 회전하지 않습니다. 왜 그런가? – Vincent

+0

새로운 측정을 받으면 super.invalidate()를 호출하십시오. 또한 ImageView 확장 클래스에서 onMeasure()를 재정의해야합니다. – Zelimir

+0

예 ondrawmethod가 반복적으로 호출되었지만 캔버스가 다시 그려지지 않았습니다. 또한 나는 super.invalidate()를 사용합니다. – Vincent