У меня есть приложение компаса, которое использует датчик ориентации, и каждый раз, когда датчик меняет мой вид компаса, становится недействительным, чтобы вращаться к северу.Мой компас - растровое изображение 444 x 444 пикселей.Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда меняется датчик, и вы видите, что компас вращается, он отстает, в основном это плохие fps.Вместо этого я попытался использовать вид поверхности и изменить SENSOR_DELAY без каких-либо изменений.Хотелось бы, чтобы кто-нибудь помог мне разобраться с решением этой проблемы.
Регистрация датчика
orientation = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sm.registerListener(this, orientation, SensorManager.SENSOR_DELAY_UI);
При каждом изменении датчика
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (compass != null) {
float[] v = event.values;
north = v[0];
compass.setNorth(-north);
}
}
Методы в представлении компаса
public void setNorth(float n) {
north_changed = true;
north = n;
invalidate();
}
private void drawBackground(Canvas canvas) {
canvas.save();
if (north_changed == true) {
canvas.rotate(north);
}
float maxwidth = (float) (backgroundTexture.getWidth() * Math.sqrt(2));
float maxheight = (float) (backgroundTexture.getHeight() * Math.sqrt(2));
float ratio = Math.min(w / maxwidth, h / maxheight);
int width = (int) (backgroundTexture.getWidth() * ratio);
int height = (int) (backgroundTexture.getHeight() * ratio);
canvas.drawBitmap(
backgroundTexture,
new Rect(0, 0, backgroundTexture.getWidth(), backgroundTexture
.getHeight()), new RectF(-width / 1.5f, -height / 1.5f,
width / 1.5f, height / 1.5f), facePaint);
canvas.restore();
}
onDraw
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if (showCompass) {
w = getWidth();
h = getHeight();
cx = w / 2;
cy = h / 2;
canvas.translate(cx, cy);
loadImages();
drawBackground(canvas);
}
}