重力感应主要是依靠手机的加速度传感器(accelerometer)来实现

在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器。因为很多功能用户根本不care的所以可能开发商会把某些功能屏蔽掉。还是得根据真机的实际情况来做开发,今天我们主要来讨论加速度传感器的具体实现方式。

传感器名称如下:

加速度传感器(accelerometer)
陀螺仪传感器(gyroscope)
环境光照传感器(light)
磁力传感器(magnetic field)
方向传感器(orientation)
压力传感器(pressure)
距离传感器(proximity)
温度传感器(temperature)

上面的是程序的运行图

遇到的问题:

1、当在与球相同的布局里面调用TextView时,球就不能移动了。最后我把球和数据分离开,用两个布局处理的。

2、不明白super.setFrame()函数到底是什么意思

有哪位大神看懂了,告诉我一下

这个是主程序代码:

package cn.itcast.accelerometer;import cn.itcast.accelerometer.view.BallView;
import android.app.Activity;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
/*** 作者:itas109* 博客:http://blog.csdn.net/itas109* 欢迎大家到博客交流* * 原作者信息------>* 利用重力加速度传感器实现滚桌球游戏* 参考资料:* 1> http://ophonesdn.com/article/show/183* 2> 重力加速度原理学习资料 http://www.riameeting.com/node/538* 由于重力加速度传感器需要在真机才能测试,为了能在模拟器中测试,可以按下面文章搭建测试环境:* http://www.xiaojiayi.com/**/
public class AccelerometerActivity extends Activity {private static final float MAX_ACCELEROMETER = 9.81f;private SensorManager sensorManager; private BallView ball; private boolean success = false; private boolean init = false; private int container_width = 0;private int container_height = 0;private int ball_width = 0;private int ball_height = 0;private TextView prompt;private TextView tv1;private TextView tv2;private TextView tv3;/*private int a=0;private int b=0;*/@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//获取感应器管理器sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);prompt = (TextView) findViewById(R.id.ball_prompt);  tv1 = (TextView)findViewById(R.id.tv1);tv2 = (TextView)findViewById(R.id.tv2);tv3 = (TextView)findViewById(R.id.tv3);}@Overridepublic void onWindowFocusChanged(boolean hasFocus) {//ball_container控件显示出来后才能获取其宽和高,所以在此方法得到其宽高super.onWindowFocusChanged(hasFocus);if(hasFocus && !init){View container = findViewById(R.id.ball_container);container_width = container.getWidth();container_height = container.getHeight();ball = (BallView) findViewById(R.id.ball);ball_width = ball.getWidth();ball_height = ball.getHeight();moveTo(0f, 0f);init = true;}}@Overrideprotected void onResume() {Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//获取重力加速度感应器success = sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME);//注册listener,第三个参数是检测的精确度 super.onResume();} @Overrideprotected void onPause() {if(success) sensorManager.unregisterListener(listener);super.onPause();}private SensorEventListener listener = new SensorEventListener() {        @Overridepublic void onSensorChanged(SensorEvent event) {/*Button bt1= (Button)findViewById(R.id.bt1);//测试图片移动bt1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View paramView) {moveTo(0,++b);//if(b>50)//    b=0;}});Button bt2= (Button)findViewById(R.id.bt2);bt2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View paramView) {moveTo(0,--b);//if(b>50)// b=0;}});*/if (!init) return ;float x = event.values[SensorManager.DATA_X];      float y = event.values[SensorManager.DATA_Y];      float z = event.values[SensorManager.DATA_Z];  prompt.setText("X=" + x + ",Y= " + y + ", Z=" + z); //当重力x,y为0时,球处于中心位置,以y为轴心(固定不动),转动手机,x会在(0-9.81)之间变化,负号代表方向moveTo(-x, y);//x方向取反if(x>0){tv1.setTextColor(Color.WHITE);tv1.setText("向左");}if(x<0){tv1.setTextColor(Color.CYAN);tv1.setText("向右");}if(y>0){tv2.setTextColor(Color.WHITE);tv2.setText("向后");}if(y<0){tv2.setTextColor(Color.RED);tv2.setText("向前");}if(z>0){tv3.setTextColor(Color.WHITE);tv3.setText("向上");}if(z<0){tv3.setTextColor(Color.YELLOW);tv3.setText("向下");}}     @Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {          }};private void moveTo(float x, float y) {int max_x = (container_width - ball_width) / 2;//在x轴可移动的最大值int max_y = (container_height - ball_height) / 2;//在y轴可移动的最大值//手机沿x、y轴垂直摆放时,自由落体加速度最大为9.81,当手机沿x、y轴成某个角度摆放时,变量x和y即为该角度的加速度float percentageX = x / MAX_ACCELEROMETER;//得到当前加速度的比率,如果手机沿x轴垂直摆放,比率为100%,即球在x轴上移动到最大值float percentageY = y / MAX_ACCELEROMETER;int pixel_x = (int) (max_x * percentageX);//得到x轴偏移量int pixel_y = (int) (max_y * percentageY);//得到y轴偏移量//以球在中心位置的坐标为参考点,加上偏移量,得到球的对应位置,然后移动球到该位置int x3=max_x + pixel_x;//屏幕中心位置+x轴偏移int y3=max_y + pixel_y;//屏幕中心位置+y轴偏移ball.moveTo(x3, y3);}
}

球的代码移动:

package cn.itcast.accelerometer.view;import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;public class BallView extends ImageView {public BallView(Context context) {super(context);}public BallView(Context context, AttributeSet attrs) {super(context, attrs);}public BallView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public void moveTo(int x, int y) {//没有弄明白什么意思,谁懂了告诉我一下啊,我加一个TextView,球就不能移动了    itas109super.setFrame(x, y, x + getWidth(), y + getHeight());//绘制视图,由左上角与右下角确定视图矩形位置}
}

整个程序的下载地址:

http://download.csdn.net/detail/itas109/6000447

Android的重力传感器(3轴加速度传感器)简单实例相关推荐

  1. android 三轴加速度传感器【转】

    一.手机中常用的传感器 在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用,具体如下:(Sensor类) #define SENSOR_TYPE_ACCE ...

  2. android SENSOR_ACCELEROMETER 三轴加速度传感器

    先看效果图: package org.ninetripods.mq.asdasdasdasdasdas; import android.content.Context; import android. ...

  3. 溢出检测单符号位法_设计经验:如何用三轴加速度传感器检测倾斜角?

    本文介绍了三轴加速度传感器的特性,并通过一个典型的应用--检测倾斜角--对单轴.双轴和三轴加速度传感器进行了比较,并给出了选型建议. 在前两篇文章中,我们介绍了单/双轴加速度传感器在来检测倾斜角上的应 ...

  4. 三轴加速度传感器和六轴惯性传感器_美泰产品推介MSV3100A三轴加速度传感器

    1 产品介绍 MSV3100A三轴加速度传感器 MSV3100A是一款三轴向模拟输出的MEMS加速度传感器.传感器由三个相互正交的微加速度计和信号变换电路组成.能够承受高达10,000g的冲击载荷和恒 ...

  5. ADI Blackfin DSP处理器-BF533的开发详解59:DSP控制ADXL345三轴加速度传感器的应用2(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  6. ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  7. ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  8. ADI Blackfin DSP处理器-BF533的开发详解61:DSP控制ADXL345三轴加速度传感器-LCD(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  9. ADI Blackfin DSP处理器-BF533的开发详解62:DSP控制ADXL345三轴加速度传感器-贪食蛇游戏(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  10. 三轴加速度传感器bma150驱动解析

    BMA150 博世 三轴加速度传感器 SPI(4线,3线),i2c,中断引脚 频响+/- 2g,4g,8g;带宽25~1500hz,中断触发内部加速度求值 低功耗,快速唤醒 包含数据寄存器,控制寄存器 ...

最新文章

  1. Android中Gallery和ImageSwitcher的使用
  2. JSP的学习二(请求转发与 重定向)
  3. 使用Asible批量部署Apache
  4. 我的邮箱又收到了一封信,这一次,关乎爱情
  5. 在网站中使用Cookie的简单例子
  6. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)
  7. Ubuntu下配置D-Link路由器进行联网
  8. /common/nlp/data/dictionary/CoreNatureDictionary.mini.txt加载失败
  9. Flink 1.11 SQL 使用攻略
  10. EXCEL-VBA函数:公历转农历,返回格式YYYY-MM-DD
  11. vue网页分享生成二维码微信扫一扫进行分享
  12. 区块链“不可能三角”
  13. 银河麒麟v10离线安装docker-ce
  14. Putty 下载安装
  15. 均衡负载集群(LBC)-1
  16. [比赛|考试] 咕咕掉的一些比赛总结
  17. 链路追踪工具 skywalking
  18. 投资的N种认偏差总有款打败你
  19. JavaScript -- jQuery网页开发案例笔记
  20. 使用cesium加载mapbox地图底色的办法

热门文章

  1. 从拼音输入法是汉字的一场灾难 看 什么是最“好”的产品设计
  2. 计算机毕业设计Java校园闲置物品交换平台系统(源码+系统+mysql数据库+Lw文档)
  3. 项目验收汇报ppt_中煤天津设计公司举办2020年度项目汇报PPT技能大赛
  4. Image captioning评价方法之BLEU (bilingual evaluation understudy)
  5. Python学好了,飞机票你还买不到么?
  6. 树莓派4B无显示器安装最新的Debian11和配置相关软件的教程(一)
  7. NTU-Coursera机器学习:HomeWork 1 Q15-20
  8. mysql重复记录大于十的数据库_MySQL专题10之MySQL序列使用、MySQL处理重复数据、MySQL以及SQL的注入...
  9. Discuz2.5菜鸟解析-1
  10. 打印机驱动特殊安装步骤