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"
/>
예. 분명히 감사합니다. 이제 onDraw 메서드에서 올바른 값을 얻습니다. 캔버스 만 회전하지 않습니다. 왜 그런가? – Vincent
새로운 측정을 받으면 super.invalidate()를 호출하십시오. 또한 ImageView 확장 클래스에서 onMeasure()를 재정의해야합니다. – Zelimir
예 ondrawmethod가 반복적으로 호출되었지만 캔버스가 다시 그려지지 않았습니다. 또한 나는 super.invalidate()를 사용합니다. – Vincent