English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事では、Androidプログラミングにおける重力感知の使用法の例を紹介します。皆さんに参考にしていただくために、以下のように共有します:
重力感知は主に加速度センサー(accelerometer)を使用して実現されています
Androidの開発では、合計で8種類のセンサーがありますが、各実機がこれらのセンサーをサポートしているとは限りません。多くの機能はユーザーが気にしていないため、開発者が一部の機能を非表示にすることがあります。実際の実機の状況に基づいて開発を行う必要があります。以下では、加速度センサーの具体的な実装方法について説明します。以下にセンサーの名前を挙げます:
加速度センサー(accelerometer)
ジャイロスコープセンサー(gyroscope)
環境光センサー(light)
磁力センサー(magnetic field)
方向センサー(orientation)
圧力センサー(pressure)
距離センサー(proximity)
温度センサー(temperature)
1.SensorManagerセンサーマネージャーオブジェクト
スマートフォン内のすべてのセンサーはSensorManagerを通じてアクセスする必要があります。getSystemService(SENSOR_SERVICE)メソッドを呼び出すことで、現在のスマートフォンのセンサーマネージャーオブジェクトを取得できます。
2.SensorEventListenerインターフェースを実装
SensorEventListenerインターフェースのonSensorChanged(SensorEventevent)メソッドを実装して、スマートフォンのセンサーの状態をキャプチャし、X軸、Y軸、Z軸の重力成分を取得します。これら三つの方向のデータが揃えば、重力センサーの原理は学習済みです。
public void onSensorChanged(SensorEvent e) { float x = e.values[SensorManager.DATA_X]; float y = e.values[SensorManager.DATA_Y]; float z = e.values[SensorManager.DATA_Z]; };
如上のコード所示:float x y z 3の範囲は-10から10の間です。以下にX軸、Y軸、Z軸の重力成分の意味について説明します(ここでは注意が必要です:座標原点:空に向かうのが正数、地面に向かうのが負数、プログラミング時の座標とは逆です):
(1)スマートフォンのスクリーンを左側に向けて、X軸は空に向かいます。垂直に置かれた場合、Y軸とZ軸には重力成分がありません。X軸が空に向かっているため、その重力成分が最大です。この時、X軸、Y軸、Z軸の重力成分の値は(10、0);
(2)スマートフォンのスクリーンを右側に向けて、X軸は地面に向かいます。垂直に置かれた場合、Y軸とZ軸には重力成分がありません。X軸が地面に向かっているため、その重力成分が最小です。この時、X軸、Y軸、Z軸の重力成分の値は(-10、0);
(3)スマートフォンのスクリーンを垂直に立てた場合、Y軸は空に向かいます。垂直に置かれた場合、X軸とZ軸には重力成分がありません。Y軸が空に向かっているため、その重力成分が最大です。この時、X軸、Y軸、Z軸の重力成分の値は(0、10、0);
(4)スマートフォンのスクリーンを垂直に立てた場合、Y軸は地面に向かいます。垂直に置かれた場合、X軸とZ軸には重力成分がありません。Y軸が地面に向かっているため、その重力成分が最小です。この時、X軸、Y軸、Z軸の重力成分の値は(0、-10、0);
(5)スマートフォンのスクリーンを上に向けて、Z軸は空に向かっています。水平に置かれた場合、X軸とY軸には重力成分がありません。Z軸が空に向かっているため、その重力成分が最大です。この時、X軸、Y軸、Z軸の重力成分の値は(0、0、10);
(6(手机屏幕向上,Z 轴就朝向地面,水平放置,这时候 X 轴与 Y 轴没有重力分量,因为 Z 轴朝向地面所以它的重力分量则最小。这时候 X 轴、Y 轴、Z 轴的重力分量的值分别为(0,0,-10)。
3. 注册 SensorEventListener
使用 SensorMannager 调用 getDefaultSensor(Sensor.TYPE_ACCELEROMETER) 方法拿到加速重力感应的 Sensor 对象。因为我讨论的是重力加速度传感器所以参数为 Sensor.TYPE_ACCELEROMETER,如果需要拿到其它的传感器需要传入对应的名称。使用 SensorMannager 调用 registerListener() 方法来注册,第三个参数是检测的灵敏精确度,根据不同的需求来选择精准度,游戏开发建议使用 SensorManagerSENSOR_DELAY_ GAME。
4 . 重力感应简单速度计算的方式
每次摇晃手机计算出 X 轴 Y 轴 Z 轴的重力分量可以将它们记录下来,然后每次摇晃的重力分量和之前的重力分量可以做一个对比,利用差值和时间就可以计算出他们的移动速度。
重力感应装置包括感应器、处理器和控制器三个部分。感应器负责侦测存储器的状态,计算存储器的重力加速度值;处理器则对加速度值是否超出安全范围进行判断;而控制器则负责控制将磁头锁定或者释放出安全停泊区。一旦感应器侦测并经处理器判断当前的重力加速度超过安全值之后,控制器就会通过硬件控制磁头停止读写工作,并快速归位,锁定在专有的磁头停泊区。这一系列动作会在200 毫秒内完成。当感应装置探测到加速度值恢复到正常值范围之后,产品才会恢复工作。
Android 多媒体框架的代码在以下目录中:external/opencore/. 这个目录是 Android 多媒体框架的根目录,其中包含的子目录如下所示:
* android: 这里面是一个上层的库,它基于 PVPlayer 和 PVAuthor 的 SDK 实现了一个为 Android 使用的 Player 和 Author
* baselibs: 包含数据结构和线程安全等内容的底层库
* codecs_v2: 这是一个内容较多的库,主要包含编解码的实现,以及一个 OpenMAX 的实现
* engines: 包含 PVPlayer 和 PVAuthor 引擎的实现
*extern_libs_v2:khronosのOpenMAXのヘッダーファイルを含みます
*fileformats:ファイル形式のパーサ(parser)クラス
* nodes:エンコーディングおよびファイル解析の各nodeクラス
* oscl:オペレーティングシステムの互換性ライブラリ
* pvmi:入出力制御の抽象インターフェース
* protocols:主にネットワークに関連するRTSP、RTP、HTTPなどのプロトコルの関連内容
* pvcommon:pvcommonライブラリのAndroid.mkファイル、ソースファイルはありません
*pvplayer:pvplayerライブラリのAndroid.mkファイル、ソースファイルはありません
* pvauthor:pvauthorライブラリのAndroid.mkファイル、ソースファイルはありません
* tools_v2:コンパイルツールおよび登録可能なモジュール
以下に一部のテストコードを示します:
private SensorManager sensorMgr; Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //前回のx y zの座標を保存 float bx = 0; float by = 0; float bz = 0; long btime = 0;//今回の時間 sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); SensorEventListener lsn = new SensorEventListener() { public void onSensorChanged(SensorEvent e) { float x = e.values[SensorManager.DATA_X]; float y = e.values[SensorManager.DATA_Y]; float z = e.values[SensorManager.DATA_Z]; //X Y Zの値を計算した後、この値を使って揺れの速度を計算できます //速度 = 路程/時間 //X軸の速度 float speadX = (x - bx) / (System.currentTimeMillis() - btime); //y軸の速度 float speadY = (y - by) / (System.currentTimeMillis() - btime); //z軸の速度 float speadZ = (z - bz) / (System.currentTimeMillis() - btime); //このように単純な速度を計算することができます。加速度を計算したい場合は、運動学では、加速度aと速度、 //の位移に関連しています:Vt=V0+at、S=V0*t+1/2at^2、S=(Vt^2-V0^2)/(2a),これらの情報を使ってaを解き出すことができます bx = x; by = y; bz = z; btime = System.currentTimeMillis(); }; public void onAccuracyChanged(Sensor s, int accuracy) { }; }; // リスナーを登録します。第3引数は検出の正確度です。 sensorMgr.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);
Androidに関するさらに詳しい内容に興味を持つ読者は、本サイトの特集を確認してください:《Android開発入門と進階教程》、《AndroidビューViewの技術的総括》、《Androidプログラミングにおけるactivityの操作技術の総括》、《AndroidSQLiteデータベースの操作技術の総括》、《AndroidJSON形式データの操作技術の総括》、《Androidデータベース操作の技術的総括》、《Androidファイル操作の技術的総括》、《Androidプログラミング開発におけるSDカードの操作方法の総括》、《Androidリソース操作の技術的総括》および《Androidコントロールの用法の総括》
本稿の内容が皆様のAndroidプログラム設計に役立つことを願っています。
声明:本稿の内容はインターネットから提供され、著作権者に帰属します。インターネットユーザーにより自発的に提供された内容であり、本サイトは所有権を有しません。人間のエディタによる編集は行われておらず、関連する法的責任も負いません。著作権侵害が疑われる場合は、以下のメールアドレスにご連絡ください:notice#oldtoolbag.com(メール送信時は、#を@に置き換えてください。侵害を申し立てる場合、関連する証拠を提供してください。確認がとれた場合、本サイトは即座に侵害される内容を削除します。)