国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android重力傳感器實現(xiàn)滾動的彈球

2020-04-11 11:12:49
字體:
供稿:網(wǎng)友

熟知:

什么是傳感器:

     所謂傳感器能夠探測如光、熱、溫度、重力、方向 等等的功能!

Android中提供傳感器有哪些:

     1.  加速度傳感器(重力傳感器)
     2.  陀螺儀傳感器
     3.  光傳感器
     5.  恒定磁場傳感器
     6.  方向傳感器
     7.  恒定的壓力傳感器
     8.  接近傳感器
     9.  溫度傳感器

一、 問題描述

Android中有多達(dá)11種傳感器,不同的手機設(shè)備支持的傳感器類型也不盡相同

1、 重力傳感器 GV-sensor
2、 加速度傳感器 G-sensor
3、  磁力傳感器  M-sensor
4、 方向傳感器  O-sensor
5、 線性加速度傳感器 LA-sensor
6、 光線感應(yīng)傳感器 SENSOR_TYPE_LIGHT
7、 溫度傳感器
8、 壓力傳感器
9、 接近傳感器
10、 旋轉(zhuǎn)矢量傳感器 RV-sensor
11、 陀螺儀傳感器Gyro-sensor

  對于傳感器的使用并不復(fù)雜,掌握不同傳感器的作用和數(shù)據(jù)參數(shù)即可,下面我們就通過實踐逐步掌握一些主要傳感器的使用

  首先我們使用重力傳感器來完成實現(xiàn)滾動的彈球,如圖所示

二、 案例技術(shù)準(zhǔn)備

1、 傳感器框架 

 傳感器應(yīng)用開發(fā)涉及到的組件如下:

Sensor 

一個指定傳感器的實例。這個類提供了各種方法讓你確定傳感器的功能。

SensorManager 

使用這個類來創(chuàng)建一個傳感器服務(wù)的實例。這個類提供了各種方法類訪問和列舉傳感器,注冊和注銷傳感器事件監(jiān)聽,并獲取相應(yīng)的信息。設(shè)置數(shù)據(jù)獲取速率,和校準(zhǔn)傳感器 

SensorEventListener 

傳感器監(jiān)聽器,檢測傳感器的數(shù)據(jù)變化,并接受傳感器事件

SensorEvent 

傳感器事件,信息載體,檢測的傳感器的數(shù)據(jù)  

2、了解重力傳感器 GV-sensor

  測量應(yīng)用于設(shè)備X、Y、Z軸上的重力,重力數(shù)值為9.8

  坐標(biāo)數(shù)據(jù):

  將手機平放在桌面上,x軸默認(rèn)為0,y軸默認(rèn)0,z軸默認(rèn)9.81。將手機朝下放在桌面上,z軸為-9.81。

  將手機向左傾斜,x軸為正值。將手機向右傾斜,x軸為負(fù)值。將手機向上傾斜,y軸為負(fù)值。將手機向下傾斜,y軸為正值。

三、 代碼實現(xiàn)

1、基于SurfaceView編寫游戲界面 (MySurfaceView)

public class MySurfaceView extends SurfaceView implements Callback, Runnable { private SurfaceHolder sfh; private Paint paint; private Thread th; private boolean flag; private Canvas canvas; private int screenW, screenH; //聲明一個傳感器管理器 private SensorManager sm; //聲明一個傳感器 private Sensor sensor; //聲明一個傳感器監(jiān)聽器 private SensorEventListener mySensorListener; //圓形的X,Y坐標(biāo) private int arc_x, arc_y; //傳感器的xyz值 private float x = 0, y = 0, z = 0; /** * SurfaceView初始化函數(shù) */ public MySurfaceView(Context context) { super(context); sfh = this.getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setColor(Color.WHITE); paint.setAntiAlias(true); setFocusable(true); //獲取傳感器管理類實例 sm = (SensorManager) MainActivity.instance.getSystemService(Service.SENSOR_SERVICE); //實例一個重力傳感器實例  sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //實例傳感器監(jiān)聽器 mySensorListener = new SensorEventListener() {  @Override  //傳感器獲取值發(fā)生改變時在響應(yīng)此函數(shù)   public void onSensorChanged(SensorEvent event) {  x = event.values[0];   //x>0 說明當(dāng)前手機左翻 x<0右翻   y = event.values[1];  //y>0 說明當(dāng)前手機下翻 y<0上翻   z = event.values[2];   //z>0 手機屏幕朝上 z<0 手機屏幕朝下   arc_x -= x;  arc_y += y;  }  @Override  //傳感器的精度發(fā)生改變時響應(yīng)此函數(shù)   public void onAccuracyChanged(Sensor sensor, int accuracy) {  } }; //為傳感器注冊監(jiān)聽器 sm.registerListener(mySensorListener, sensor, SensorManager.SENSOR_DELAY_GAME); } /** * SurfaceView視圖創(chuàng)建,響應(yīng)此函數(shù) */ @Override public void surfaceCreated(SurfaceHolder holder) { screenW = this.getWidth(); screenH = this.getHeight(); flag = true; //實例線程 th = new Thread(this); //啟動線程 th.start(); } /** * 游戲繪圖 */ public void myDraw() { try {  canvas = sfh.lockCanvas();  if (canvas != null) {  canvas.drawColor(Color.BLACK);  paint.setColor(Color.RED);  canvas.drawArc(new RectF(arc_x, arc_y, arc_x + 50, arc_y + 50), 0, 360, true, paint);  paint.setColor(Color.YELLOW);  canvas.drawText("當(dāng)前重力傳感器的值:", arc_x - 50, arc_y - 30, paint);  canvas.drawText("x=" + x + ",y=" + y + ",z=" + z, arc_x - 50, arc_y, paint);  String temp_str = "tony提示: ";  String temp_str2 = "";  String temp_str3 = "";  if (x < 1 && x > -1 && y < 1 && y > -1) {   temp_str += "當(dāng)前手機處于水平放置的狀態(tài)";   if (z > 0) {   temp_str2 += "并且屏幕朝上";   } else {   temp_str2 += "并且屏幕朝下,提示別躺著玩手機,對眼睛不好喲~";   }  } else {   if (x > 1) {   temp_str2 += "當(dāng)前手機處于向左翻的狀態(tài)";   } else if (x < -1) {   temp_str2 += "當(dāng)前手機處于向右翻的狀態(tài)";   }   if (y > 1) {   temp_str2 += "當(dāng)前手機處于向下翻的狀態(tài)";   } else if (y < -1) {   temp_str2 += "當(dāng)前手機處于向上翻的狀態(tài)";   }   if (z > 0) {   temp_str3 += "并且屏幕朝上";   } else {   temp_str3 += "并且屏幕朝下,提示別躺著玩手機,對眼睛不好喲~";   }  }  paint.setTextSize(10);  canvas.drawText(temp_str, 0, 50, paint);  canvas.drawText(temp_str2, 0, 80, paint);  canvas.drawText(temp_str3, 0, 110, paint);  } } catch (Exception e) {  // TODO: handle exception } finally {  if (canvas != null)  sfh.unlockCanvasAndPost(canvas); } } /** * 觸屏事件監(jiān)聽 */ @Override public boolean onTouchEvent(MotionEvent event) { return true; } /** * 按鍵事件監(jiān)聽 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); } /** * 游戲邏輯 */ private void logic() { } @Override public void run() { while (flag) {  long start = System.currentTimeMillis();  myDraw();  logic();  long end = System.currentTimeMillis();  try {  if (end - start < 50) {   Thread.sleep(50 - (end - start));  }  } catch (InterruptedException e) {  e.printStackTrace();  } } } /** * SurfaceView視圖狀態(tài)發(fā)生改變,響應(yīng)此函數(shù) */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } /** * SurfaceView視圖消亡時,響應(yīng)此函數(shù) */ @Override public void surfaceDestroyed(SurfaceHolder holder) { flag = false; }} 

2、 編寫主程序

public class MainActivity extends Activity { public static MainActivity instance; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); instance = this; //設(shè)置全屏 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); //顯示自定義的SurfaceView視圖 setContentView(new MySurfaceView(this)); }}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 谢通门县| 隆化县| 永仁县| 东辽县| 黄骅市| 遵义市| 邵阳市| 商河县| 陕西省| 红原县| 彩票| 泰来县| 阳西县| 安西县| 阜康市| 卓尼县| 北宁市| 定兴县| 湖南省| 普兰店市| 溧阳市| 乌拉特前旗| 孝义市| 额敏县| 嫩江县| 唐山市| 衡山县| 万宁市| 天津市| 防城港市| 浮梁县| 通山县| 华坪县| 兰溪市| 太湖县| 务川| 新密市| 绥德县| 浮梁县| 昌邑市| 南开区|