2017-02-23 147 views
3

У меня есть негабаритный снимок, который я хочу перемещать вверх, вниз, влево и вправо, используя значения Accelerometer. Я создал следующий код, который работает, но изображение перемещается в отдельных шагах и не скользит плавно.Как перемещать ImageView вдоль оси X и Y с помощью данных акселерометра датчика

float[] matrix = new float[9]; 
mMatrix.getValues(matrix); 

if (accelerometerValues[0] < MOVE_RIGHT_LIMIT) { 

mMatrix.setTranslate(matrix[2] + 10, matrix[5]); 
mSchematicDiagram.setImageMatrix(mMatrix); 

Log.d("PROJECTA_SENSOR", "Moving Right"); 

Правильно ли использовать setTranslate на ImageView матрицы для такого рода прецедентом и как бы вы создать этот плавный переход?

ответ

2

я не уверен, какой образ вы хотите переместить, и поэтому с помощью матрицы, но если у вас есть ImageView, вы можете сделать это путем установки значений X и Y в onSensorChanged методе

@Override 
public void onSensorChanged(SensorEvent event) { 

    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 

     x -= (int) event.values[0]; 
     y += (int) event.values[1]; 

     yourImageView.setY(y); 
     yourImageView.setX(x); 

    } 
} 

Здесь мой код MainActivity, который работает хорошо (мне просто нужно добавить границы, потому что в настоящее время изображение может перемещаться из границ экрана), возможно, это поможет кому-то.

import android.app.Activity; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.widget.ImageView; 


public class MainActivity extends Activity implements SensorEventListener{ 

    private SensorManager sensorManager; 
    private Sensor accelerometer; 
    private long lastUpdate; 

    ImageView mDrawable; 
    public static int x = 0; 
    public static int y = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mDrawable = (ImageView) findViewById(R.id.image); 
     sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     lastUpdate = System.currentTimeMillis(); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     sensorManager.registerListener(this, accelerometer, 
       SensorManager.SENSOR_DELAY_GAME); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     sensorManager.unregisterListener(this); 
    } 


    @Override 
    public void onSensorChanged(SensorEvent event) { 

     if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 

      x -= (int) event.values[0]; 
      y += (int) event.values[1]; 

      mDrawable.setY(y); 
      mDrawable.setX(x); 

     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 
}