sensorManager实现小球滚动

1、布局

<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" >

    <org.lsp.sensordemo.view.MyView
        android:id="@+id/my_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </org.lsp.sensordemo.view.MyView>

</RelativeLayout>
2、创建vo

public class Ball {

	private float x;
	private float y;
	private float r;
	private Bitmap ballImg;

	private float xSpeed;
	private float ySpeed;

	public Ball(Resources res) {
		ballImg = BitmapFactory.decodeResource(res, R.drawable.ball);

		Matrix m = new Matrix();
		m.postScale((MainActivity.SCREEN_WIDTH / 10f) / ballImg.getWidth(),
				(MainActivity.SCREEN_WIDTH / 10f) / ballImg.getHeight());

		ballImg = Bitmap.createBitmap(ballImg, 0, 0, ballImg.getWidth(),
				ballImg.getHeight(), m, false);

		x = 0;
		y = 0;

		r = ballImg.getWidth() / 2;
	}

	public void draw(Canvas canvas, Paint paint) {
		canvas.drawBitmap(ballImg, x, y, paint);

		x += xSpeed;
		y += ySpeed;

		if (x < 0) {
			x = 0;
		}
		if (x > MainActivity.SCREEN_WIDTH - r * 2) {
			x = MainActivity.SCREEN_WIDTH - r * 2;
		}
		if (y < 0) {
			y = 0;
		}
		if (y > MainActivity.SCREEN_HEIGHT - r * 2) {
			y = MainActivity.SCREEN_HEIGHT - r * 2;
		}
	}

	public void setSpeed(float xSpeed, float ySpeed) {
		this.xSpeed = xSpeed;
		this.ySpeed = ySpeed;
	}

}
3、创建View

public class MyView extends View {

	private Ball ball;

	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);

		ball = new Ball(getResources());

		setBackgroundResource(R.drawable.gamebg);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		Paint paint = new Paint();

		// 画图
		if (ball != null) {
			ball.draw(canvas, paint);
		}
	}

	public Ball getBall() {
		return ball;
	}

}
4、在Activity中实现功能

public class MainActivity extends Activity {

	// private TextView content;
	private MyView myView;

	public static int SCREEN_WIDTH;
	public static int SCREEN_HEIGHT;

	private boolean flag = true;

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		SCREEN_WIDTH = getWindowManager().getDefaultDisplay().getWidth();
		SCREEN_HEIGHT = getWindowManager().getDefaultDisplay().getHeight();

		setContentView(R.layout.activity_main);

		// content = (TextView) findViewById(R.id.content);
		myView = (MyView) findViewById(R.id.my_view);

		final SensorManager manager = (SensorManager) getSystemService(SENSOR_SERVICE);
		// 建立传感器对象
		Sensor s = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
		// 设置监听,当传感器中的值有变化时,自动进行监听反馈
		manager.registerListener(new SensorEventListener() {

			@Override
			public void onSensorChanged(SensorEvent event) {
				// 当有变化时,自动执行此方法
				// 通过event可以取得三个方向的加速度值
				float[] values = event.values;
				// StringBuilder builder = new StringBuilder();
				// builder.append(values[0] + "\r\n");
				// builder.append(values[1] + "\r\n");
				// builder.append(values[2] + "\r\n");
				//
				// content.setText(builder.toString());

				myView.getBall().setSpeed(-values[2], -values[1]);

			}

			@Override
			public void onAccuracyChanged(Sensor sensor, int accuracy) {
			}
		}, s, SensorManager.SENSOR_DELAY_GAME);

		Thread t = new Thread() {
			@Override
			public void run() {
				while (flag) {
					try {
						Thread.sleep(1000 / 30);
					} catch (Exception e) {
						e.printStackTrace();
					}
					myView.postInvalidate();
				}
			}
		};
		t.start();

	}

	@Override
	protected void onDestroy() {
		flag = false;
		super.onDestroy();
	}

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值