1,重力感应主要是用到SensorManager,获取小球在各个方向的加速度,以改变小球的位置来实现重力感应

以屏幕的左下方为原点(2d编程的时候,是以屏幕左上方为原点的,这个值得注意一下),箭头指向的方向为正。

从-10到10,以浮点数为等级单位,想象一下以下情形:

手机屏幕向上(z轴朝天)水平放置的时侯,(x,y,z)的值分别为(0,0,10);

手机屏幕向下(z轴朝地)水平放置的时侯,(x,y,z)的值分别为(0,0,-10);

手机屏幕向左侧放(x轴朝天)的时候,(x,y,z)的值分别为(10,0,0);

手机竖直(y轴朝天)向上的时候,(x,y,z)的值分别为(0,10,0);

其他的如此类推,规律就是:朝天的就是正数,朝地的就是负数。利用x,y,z三个值求三角函数,就可以精确检测手机的运动状态了。

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;

public class MainActivity extends Activity {

MyView mAnimView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_gravity);

requestWindowFeature(Window.FEATURE_NO_TITLE);  //全屏显示窗口
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //强制横屏

mAnimView = new MyView(this);  // 显示自定义的游戏View
setContentView(mAnimView);

}

public class MyView extends SurfaceView implements Callback,Runnable ,SensorEventListener{ 
public static final int TIME_IN_FRAME = 50; //每50帧刷新一次屏幕  
Paint mPaint = null;    //游戏画笔  
Paint mTextPaint = null;
SurfaceHolder mSurfaceHolder = null; 
boolean mRunning = false;   // 控制游戏更新循环   
Canvas mCanvas = null;   //游戏画布   
Canvas mycan;
Bitmap mypic;
boolean mIsRunning = false;   //**控制游戏循环**/ 
private SensorManager mSensorMgr = null;   //SensorManager管理器
Sensor mSensor = null; 
int mScreenWidth = 0;     //**手机屏幕宽高**/
int mScreenHeight = 0;
private int mScreenBallWidth = 0;          //**小球资源文件越界区域**/
private int mScreenBallHeight = 0; 
private Bitmap mbitmapBg;      //**游戏背景文件**/
private Bitmap mbitmapBall;         //**小球资源文件**/ 
private float mPosX = 200;             //**小球的坐标位置**/
private float mPosY = 0; 
private float mGX = 0;               //**重力感应X轴 Y轴 Z轴的重力值**/
private float mGY = 0;
private float mGZ = 0;
int width,height;

public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub 
   this.setFocusable(true);              //** 设置当前View拥有控制焦点 **/ 
   this.setFocusableInTouchMode(true);      //** 设置当前View拥有触摸事件 **/ 
   mSurfaceHolder = this.getHolder();         //** 拿到SurfaceHolder对象 **/ 
   mSurfaceHolder.addCallback(this);             //** 将mSurfaceHolder添加到Callback回调函数中 **/ 
   mCanvas = new Canvas();           //** 创建画布 **/ 
   mPaint = new Paint();            //** 创建曲线画笔 **/
   mPaint.setColor(Color.WHITE); 
   mbitmapBall = BitmapFactory.decodeResource(this.getResources(), R.drawable.flower);   //**加载小球资源**/
  mbitmapBg = BitmapFactory.decodeResource(this.getResources(), R.drawable.underground);     //**加载游戏背景**/

mSensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);     //**得到SensorManager对象**/
   mSensor = mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
   
// 注册listener,第三个参数是检测的精确度
           //SENSOR_DELAY_FASTEST 最灵敏 因为太快了没必要使用
           //SENSOR_DELAY_GAME    游戏开发中使用
           //SENSOR_DELAY_NORMAL  正常速度
           //SENSOR_DELAY_UI       最慢的速度
   mSensorMgr.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
}
private void Draw() {

RectF new_rect = new RectF(0, 0, width, height);
mCanvas.drawBitmap(mbitmapBg, null, new_rect, mPaint);
//
 
// mCanvas.drawBitmap(mbitmapBg, getClipBounds(), getClipBounds(), mPaint);

//    mCanvas.drawBitmap(mbitmapBg,0,0, mPaint);  //**绘制游戏背景**/ 
   mCanvas.drawBitmap(mbitmapBall, mPosY,mPosX, mPaint);     //**绘制小球**/ 
   mCanvas.drawText("X轴重力值 :" + mGX, 0, 20, mPaint);    //**X轴 Y轴 Z轴的重力值**/
   mCanvas.drawText("Y轴重力值 :" + mGY, 0, 40, mPaint);
   mCanvas.drawText("Z轴重力值 :" + mGZ, 0, 60, mPaint);
}

@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub       //获取小球在各个方向的加速度,以改变小球的位置来实现重力感应
 mGX = event.values[SensorManager.DATA_X];
   mGY= event.values[SensorManager.DATA_Y];
   mGZ = event.values[SensorManager.DATA_Z];
   
  
   mPosX += mGX * 0.5;   //这里乘以2是为了让小球移动的更快
   mPosY += mGY * 0.5;
   
 //检测小球是否超出边界
   if (mPosX < 0) {
mPosX = 0;
   } else if (mPosX > mScreenBallHeight) {
mPosX = mScreenBallHeight;
   }
   if (mPosY < 0) {
mPosY = 0;
   } else if (mPosY > mScreenBallWidth) {
mPosY = mScreenBallWidth;
   }

}

@Override
public void run() {
// TODO Auto-generated method stub
while (mIsRunning) { 
long startTime = System.currentTimeMillis();   //** 取得更新游戏之前的时间 **/ 
synchronized (mSurfaceHolder) {                  //** 在这里加上线程安全锁 **/ 
   mCanvas = mSurfaceHolder.lockCanvas();   //** 拿到当前画布 然后锁定 **/
   Draw(); 
   mSurfaceHolder.unlockCanvasAndPost(mCanvas);  // 绘制结束后解锁显示在屏幕上 **/

long endTime = System.currentTimeMillis();  //** 取得更新游戏结束的时间 **/ 
int diffTime = (int) (endTime - startTime);  //** 计算出游戏一次更新的毫秒数 **/ 
while (diffTime <= TIME_IN_FRAME) {    //** 确保每次更新时间为50帧 **/
   diffTime = (int) (System.currentTimeMillis() - startTime);
 
   Thread.yield();    //** 线程等待 **/
}
}
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub  
   mIsRunning = true;      //**开始游戏主循环线程**/
   new Thread(this).start();       //**得到当前屏幕宽高**/
   mScreenWidth = this.getWidth();
   mScreenHeight = this.getHeight(); 
   mScreenBallWidth = mScreenWidth - mbitmapBall.getWidth();     //**得到小球越界区域**/
   mScreenBallHeight = mScreenHeight - mbitmapBall.getHeight();
width=this.getWidth();
height=this.getHeight();
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
  mIsRunning = false;
}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

Android重力感应相关推荐

  1. android重力传感器横竖反,Android重力感应实现方式

    在Android应用程序的开发中,占据主要地位的当属游戏的开发.我们在这篇文章中将会针对在游戏中需要用到的重力感应功能,来为大家详细分析Android重力感应的实现方法,以帮助大家解决相关问题. An ...

  2. Android重力感应开发

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

  3. Android重力感应基础

    android中的很多游戏的游戏都使用了重力感应的技术,但其api demo却并没有重力感应的实例(不知道是不是我没找到,找到的朋友麻烦告诉我一下,谢谢),因为开发的需要,就研究了一下重力感应这方面, ...

  4. Android重力感应示例

    android中的很多游戏的游戏都使用了重力感应的技术,就研究了一下重力感应 以屏幕的左下方为原点,箭头指向的方向为正.从-10到10,以浮点数为等级单位,想象以下情形: 手机屏幕向上(z轴朝天)水平 ...

  5. android重力感应横竖屏,Android开发 apk强制横竖屏

    Android开发 apk强制横竖屏 (2014-05-02 10:57:50) 标签: 杂谈 全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添 ...

  6. android 重力感应view,Android重力感应示例

    android中的很多游戏的游戏都使用了重力感应的技术, 就研究了一下重力感应 以屏幕的左下方为原点,箭头指向的方向为正.从-10到10,以浮点数为等级单位,想象以下情形: 手机屏幕向上(z轴朝天)水 ...

  7. android 重力感应的使用

    作者:GrayD 重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care ...

  8. android 重力感应 横竖屏切换,重力感应 横竖屏切换

    1,去掉StatusBar 在info.plist添加UIStatusBarHidden设置Boolean,设置为YES. 2,横屏 继续在info.list中添加UIInterfaceOrienta ...

  9. Android 重力感应

    Android重力感应器Sensor编程 [日期:2010-10-23] 来源:Linux社区  作者:Linux 1.取得重力感应器Sensor对象 在 Activity 中定义以下成员变量: pr ...

  10. android 重力感应 讲解

    一:什么是传感器:      所谓传感器能够探测如光.热.温度.重力.方向 等等的功能! 二:Android中提供传感器有哪些: 1.  加速度传感器(重力传感器) 2.  陀螺仪传感器 3.  光传 ...

最新文章

  1. SpringBoot2 集成日志,复杂业务下的自定义实现
  2. java.lang.ClassNotFoundException: javax.servlet.Filter
  3. oracle 断电 瞬间 同步,Oracle 11g 测试ogg中断之后,重新同步操作
  4. BootStrap修改modal模态框的宽度
  5. 数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径
  6. 雷霄骅《视音频数据处理入门:H.264视频码流解析》(代码注释版)
  7. Type-C PD充电简介
  8. 教师-学生网络下Self-Ensembing with GAN-based Data Augmentation for Domain Adaption in Sematic Segmentation
  9. 计算机专业技能考核方案,计算机专业技能课教学考核方案
  10. Windows 10正式版官方原版ISO镜像下载
  11. 小米OJ12月常规赛“数数字”题目详解与SG函数SG定理个人理解
  12. 微信小程序大全之100荐(701~800)
  13. linux系统的版本(转载)
  14. 内核aio_AIO 简介
  15. CCI指标之指标用法以及CCI指标之指标用途
  16. 2019年天津大学计算机专业本校保研经验帖
  17. 【ML特征工程】第 3 章 :文本数据:扁平化、过滤和分块
  18. 宝宝的护照和签证办理信息搜集及短期签证更新手续
  19. 不负好时光 北京踏青好去处推荐
  20. 超低配置机器无盘网吧的安装方法(转)

热门文章

  1. 编译错误:invalid types ‘int[int]‘ for array subscrip-markdown编辑器
  2. 如何查询iPhone手机的序列号?苹果序列号查询方法
  3. VMware ESX Server常用命令行
  4. 技术管理实战笔记-团队建设篇
  5. 浅谈督查督办管理系统在企业管理中起到的作用
  6. 2022大宗商品现货交易所织梦网站模板源码+大气美观
  7. Android 微信登录 无法调起授权页面
  8. 【数据库系统原理与应用/数据库系统概论】 期末复习手册
  9. DEV C++设置背景音乐
  10. Learning Center Probability Map for Detecting Objects in Aerial Images 论文学习笔记