用加速度计android移动一个球

时间:2012-10-06 19:30:51

标签: android accelerometer

您好我已经编写了此代码,用ImageView和加速度计移动一个简单的球,但不起作用。 我使用过ball.scrollTo(xa,ya),但这段代码不适用于变量捕捉加速度计

发布我的代码:

Main.java

package com.crowley.test;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.ImageView;
import android.widget.TextView;
import android.util.Log;


public class Main extends Activity implements SensorEventListener {
final String tag = "AccLogger";
SensorManager sensore=null;
TextView x=null;
TextView y=null;
TextView z=null;
TextView xat=null;
TextView yat=null;
String a;
String b;
private ImageView ball;

int xa=0;
int ya=0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    sensore = (SensorManager) getSystemService(SENSOR_SERVICE);
    x= (TextView) findViewById(R.id.x);
    y= (TextView) findViewById(R.id.y);
    z= (TextView) findViewById(R.id.z);
    xat= (TextView) findViewById(R.id.textView1);
    yat= (TextView) findViewById(R.id.textView2);

    ball = (ImageView) findViewById(R.id.ball);
    ball.scrollTo(xa, ya);


    ball.setImageResource(R.drawable.ball);


 }


  public void onSensorChanged(SensorEvent event){
     Sensor sensor = event.sensor;
     float [] values = event.values;
     synchronized (this) {
             Log.d(tag, "onSensorChanged: " + sensor + ", x: " + 
                             values[0] + ", y: " + values[1] + ", z: " + values[2]);
     if (sensor.getType() == Sensor.TYPE_ACCELEROMETER ) {
         x.setText("x"+ values[0]);
         y.setText("y"+ values[1]);
         z.setText("z"+ values[2]);

         xa=(int)values[0];// this part of code is only test to see int x and y on Activity
         ya=(int)values[1];

         a=Integer.toString(xa);
         b=Integer.toString(ya);

         xat.setText(a);
         yat.setText(b);

         //x.setText("x"+ SensorManager.DATA_X);
         //y.setText("y"+ SensorManager.DATA_Y);
         //z.setText("z"+ SensorManager.DATA_Z);
     }
     }
  }

 public void onAccuracyChanged(Sensor sensor, int accuracy) {
    Log.d(tag,"onAccuracyChanged: " + sensor + ", accuracy: " + accuracy);
 }

  protected void onResume() {
    super.onResume();
    Sensor Accel = sensore.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
   // register this class as a listener for the orientation and accelerometer sensors
    sensore.registerListener((SensorEventListener) this, Accel,        SensorManager.SENSOR_DELAY_FASTEST);
  }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
}

和我的main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/x"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginTop="16dp"
    android:text="" />

<TextView
    android:id="@+id/y"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/x"
    android:text="" />

<TextView
    android:id="@+id/z"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/y"
    android:text="" />

<ImageView
    android:id="@+id/ball"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ball" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_marginBottom="71dp"
    android:layout_marginRight="66dp"
    android:text="TextView" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignRight="@+id/textView1"
    android:layout_alignTop="@+id/textView1"
    android:layout_marginTop="35dp"
    android:text="TextView" />

    </RelativeLayout>

2 个答案:

答案 0 :(得分:2)

当传感器发生变化时,您不会改变球的位置。

我没有测试过,但你应该这样做:

onSensorChanged()末尾添加ball.scrollBy(xa, ya);或类似内容。

您拨打了ball.scrollTo(x,y); onCreate()中的{{1}},但是一旦您的传感器开始报告,您根本不会移动球。

答案 1 :(得分:0)

你做错了两件事。 您没有移动ImageView。您只能在onCreate()方法中设置其坐标。你应该一直设置它 - 在onSensorChanged方法中。

其次,你不应该使用scrollTo,而是offsetLeftAndRight(int offset)&amp; offsetTopAndBottom(int offset)并在invalide()方法结束时调用球。onSensorChanged