我有一个超大的图像,我想使用Accelerometer值向上,向下,向左和向右移动。我创建了以下可用的代码,但图像以不同的步骤移动,并且不能平滑滑动。
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");
对于这种用例,在ImageView矩阵上使用setTranslate是否正确?如何创建这种平滑过渡?
答案 0 :(得分:2)
我不确定你想要移动什么样的图像以及为什么要使用矩阵,但是如果你有一个ImageView,你可以通过在onSensorChanged方法中设置X和Y值来实现它
@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) {
}
}