2014-03-25 5 views
0

ImageView에서보기를 만들었습니다. 이 이미지 뷰는 화면상의 볼입니다 (가속도 센서에 따라 다름). 지금 나는 어떻게 화면에 현재 positon을 얻을 수 있습니까? 왜냐하면 나는 공을 화면 밖으로 나오기를 원하지 않기 때문입니다. 같은 :현재 위치 얻기 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을 사용하는 것이 좋습니다 하나?

더 많은 장치를 지원하고 싶습니다.

넌 X를 리턴 및 Y 기준 각각 좌표 getTop()getLeft() 함수를 호출하여 볼의 위치를 ​​검색 할 수

답변

1

당신은 이미 x와 y 인 위치를 알고 있습니다.

당신이해야 할 일은이 값들이 화면에서 떨어지는 것을 막는 것입니다.

첫째, 화면의 크기를 얻을 :

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

지금 크기가 화면 크기 보유하고 있습니다.

그런 다음 당신은 x와 y 위치를 처리하는 스레드를 사용하는 것이 나는 또한 권 해드립니다 것이다 당신의 방법

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 

    } 

에 다음을 추가합니다. 스레드가 실행되는 빈도를 제어 할 수 있으며 이벤트가 발생할 때마다 센서가 트리거됩니다.

Android 센서를 더 잘 이해하려면 다음을 읽어보십시오. http://www.codeproject.com/Articles/729759/Android-Sensor-Fusion-Tutorial 일부 센서는 하드웨어 센서이며 다른 센서는 하드웨어 센서를 결합한 소프트웨어 센서입니다.

귀하의 경우 : 귀하의 앱의 목적이 무엇인지 확실하지 않지만 화면 기울이기로 공을 이동하고 싶습니다. GRAVITY가 완벽하게 작동한다고 저는 말할 수 있습니다.

+2

개체의 크기를 고려하면 너비와 높이를 2로 나눌 수 있습니다. 그렇지 않으면 화면 밖으로 부분적으로 벗어납니다. –

1

: 유형 선택 http://developer.android.com/reference/android/view/View.html#Position

Acceleromtere는 가속도를 측정하는 수단을 사용 offcourse 목적에 따라 달라 장치는 중력이 장치의 중력을 측정하는 동안 장치. 가속도계 값에는 여기에 언급 된 중력 값이 포함되어 있습니다. http://developer.android.com/guide/topics/sensors/sensors_motion.html

저는 개인적으로 가속도계 또는 자이로 스코프를 사용하는 것이 좋습니다. 자이로 스코프는 가속을 사용하지 않고 공간에서 장치의 실제 방향을 지정합니다. 실제 방향은 사용자가 실제로 찾고있는 것일 수 있습니다.