Android View и датчики - PullRequest
       4

Android View и датчики

1 голос
/ 03 февраля 2012

У меня есть приложение компаса, которое использует датчик ориентации, и каждый раз, когда датчик меняет мой вид компаса, становится недействительным, чтобы вращаться к северу.Мой компас - растровое изображение 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);
    }
}

1 Ответ

2 голосов
/ 03 февраля 2012

Вы можете попробовать это

заменить:

sm.registerListener (this, direction, SensorManager.SENSOR_DELAY_UI);

с этим:

sm.registerListener (this, direction, SensorManager.SENSOR_DELAY_FASTEST);


А если вам нужна дополнительная плавность

заменить:

if (compass != null) {
    float[] v = event.values;
    north = v[0];
    compass.setNorth(-north);
}

с этим:

if (compass != null) {
    float[] v = event.values;
    north =north*0.1f + v[0]*0.9f;
    compass.setNorth(-north);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...