【问题标题】:How to move an ImageView along X and Y axis with Sensor Accelerometer Data如何使用传感器加速度计数据沿 X 和 Y 轴移动 ImageView
【发布时间】:2017-04-17 04:58:47
【问题描述】:

我想要使用加速度计值向上、向下、向左和向右移动一个超大图像。我创建了以下有效的代码,但图像以不同的步骤移动并且滑动不顺畅。

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 是否正确,您将如何创建这种平滑过渡?

【问题讨论】:

    标签: android android-imageview android-sensors


    【解决方案1】:

    我不确定你想要移动什么样的图像以及为什么使用矩阵,但是如果你有一个 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) {
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 2023-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多