2014-03-25 219 views
0

我从ImageView创建了一个视图。此imageview是屏幕上的球(取决于加速度传感器)。现在我怎么能在屏幕上获得当前的位置?因为我不希望球离开屏幕。像:获取当前位置ImageView

enter image description here

我的所有代码:

public class MainActivity extends Activity implements SensorEventListener { 
    private SensorManager sensorManager; 
    private Sensor accelerometer; 

    AnimatedView animatedView = null; 
    ShapeDrawable mDrawable = new ShapeDrawable(); 
    public static int x; 
    public static int y; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // setContentView(R.layout.activity_main); 

     sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     accelerometer = sensorManager 
       .getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 

     animatedView = new AnimatedView(this); 
     setContentView(animatedView); 
    } 

    @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 onAccuracyChanged(Sensor arg0, int arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // TODO Auto-generated method stub 


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

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

     } 
    } 

    public class AnimatedView extends ImageView { 

     static final int width = 100; 
     static final int height = 100; 

     public AnimatedView(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 

      mDrawable = new ShapeDrawable(new OvalShape()); 
      mDrawable.getPaint().setColor(0xffffAC23); 
      mDrawable.setBounds(x, y, x + width, y + height); 


     } 

     @Override 
     protected void onDraw(Canvas canvas) { 

      mDrawable.setBounds(x, y, x + width, y + height); 
      mDrawable.draw(canvas); 
      invalidate(); 
     } 
    } 

} 

其它问题, 哪一个是更好地使用TYPE_ACCELEROMETER或TYPE_GRAVITY?

我想支持更多的设备。

回答

1

你已经知道了位置,这是你的x和y。

你需要做的是停止屏幕下降这些值。

首先,让你的屏幕大小:

Display display = getWindowManager().getDefaultDisplay(); 
Point size = new Point(); 
display.getSize(size); 

现在大小保持屏幕尺寸。

然后将以下添加到您的方法

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

      x -= ((int) event.values[0])*4; 
      y += ((int) event.values[1])*4; 
      if(x < 0) 
       x = 0; 
      else if(x > size.x) 
       x = size.x 
      if(y < 0) 
       y = 0; 
      else if (y > size.y) 
       y = size.y 

    } 

我也是会建议你使用一个线程来处理x和y位置。您可以控制线程运行的频率,传感器每次发生事件时都会触发。

为了更好地理解Android传感器,请阅读以下内容:http://www.codeproject.com/Articles/729759/Android-Sensor-Fusion-Tutorial 某些传感器是硬件传感器,其他传感器是组合硬件传感器的软件传感器。

在你的情况:我不知道你的应用程序的目的是什么,但我想你想通过倾斜屏幕来移动球。我会说GRAVITY完美地适用于此。

+2

不要忘记考虑物体的大小,宽度和高度应该除以2.否则它仍然会部分落在屏幕之外。 –

1

可以通过调用getTop()getLeft()功能,这返回x和y分别坐标,参考检索视图的位置:http://developer.android.com/reference/android/view/View.html#Position

选择的类型取决于目标offcourse,使用Acceleromtere装置测量的加速度该装置在重力下测量装置上的重力。 请注意加速度数值包括这里提到的重力数值:http://developer.android.com/guide/topics/sensors/sensors_motion.html

我个人建议使用加速度计或陀螺仪。陀螺仪不使用加速度,而是设备在空间中的实际方向,这可能是您实际寻找的。