2017-02-23 24 views
3

加速度計の値を使用して、上下左右に移動したい大きめの画像があります。私は次のコードを作成しましたが、イメージは別個のステップで動き、スムーズにスライドしません。Sensor Accelerometerデータを使用してX軸とY軸に沿ってImageViewを移動する方法

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を使用するのは正しいですか。このスムーズな移行をどのように作成しますか?

答えて

2

iは、行列を使用して、なぜあなたが移動すると、画像のどのようなわからないんだけど、あなたはImageViewのを持っている場合、あなたは

@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); 

    } 
} 

ここonSensorChanged方法でXとYの値を設定することによってそれを行うことができます私の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) { 

    } 
} 
関連する問題