2012-02-03 3 views
1

У меня есть приложение компаса, в котором используется датчик ориентации, и каждый раз, когда датчик меняет мой взгляд компаса, он недействителен, чтобы вращаться к северу. Мой компас - растровое изображение 444px x 444px. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда датчик изменяется, и вы видите, что вращающийся компас отстает, в основном плохие fps. Вместо этого я попытался использовать поверхностное представление и изменить SENSOR_DELAY без каких-либо изменений. Хотел бы, чтобы кто-то помог мне выяснить ответ на эту проблему.Android View и датчики

Регистрация датчик

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

loadImages(); Загружаете ли вы изображения на каждый кадр чертежа? – Olsavage

+0

Глупо мне, загружая изображения в конструкторе, исправил проблему. Благодарю. – user1163392

ответ

2

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

заменить:

sm.registerListener (это, ориентация, SensorManager.SENSOR_DELAY_UI);

с этим:

sm.registerListener (это, ориентация, 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); 
} 
Смежные вопросы