android传感器功能实现

本文介绍了一种利用Android设备内置传感器实现视图旋转的方法。通过定义自定义视图类MyView并继承View,该视图能根据传感器数据实时更新其显示的内容。此外,还详细介绍了如何在Activity中注册传感器监听器,以及如何根据传感器返回的角度值更新视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
1、创建Myview类

public class MyView extends View {

	private Bitmap a;

	private float degree = 0;

	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		a = BitmapFactory.decodeResource(getResources(), R.drawable.a);

		// 将图片大小重新设置
		Matrix m = new Matrix();
		m.postScale((MainActivity.SCREEN_WIDTH - 20f) / a.getWidth(),
				(MainActivity.SCREEN_WIDTH - 20f) / a.getHeight());

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

	public void reDraw(float degree) {
		this.degree = degree;
		postInvalidate();
	}

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

		Paint paint = new Paint();

		// 画图
		if (a != null) {
			// 准备进行画布的旋转
			canvas.save();

			canvas.rotate(-degree + 180, MainActivity.SCREEN_WIDTH / 2,
					MainActivity.SCREEN_HEIGHT / 2);

			canvas.drawBitmap(a, 10,
					(MainActivity.SCREEN_HEIGHT - a.getHeight()) / 2, paint);

			canvas.restore();
		}
	}

}
3、创建Activity类

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

		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.reDraw(values[0]);

			}

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

	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值