玉転がしタブレット端末の特徴の一つとして, センサを使った動作や, 指による画面操作がある. それらを活用して, 図形を動かすアプリの例を示す. 1. プロジェクトを作る Tama アプリケーションを作る,Tama プロジェクトを作る. 図 1 プロジェクト作成 プロジェクトの構成を設定する. 図

Similar documents
ファイルを直接編集する画面を切り替えることができる. 図 3 標準のレイアウトを削除する (2) グラフィカル レイアウト画面で LinearLayout(Vertical) を追加するパレットウィンドウの レイアウト の中にある LinearLayout(Vertical) をドラッグして, 編集

2 // TODO Auto-generated method stub float x = event.getx(); float y = event.gety(); String action = ""; switch(event.getaction()) { case MotionEvent.

1: Android 2 Android 2.1 Android 4 Activity Android Service ContentProvider BroadcastReceiver Activity ( ): Android 1 Android Service ( ): ContentProv

ボタンイベントアプリイベント処理を含むアプリとして, ボタンをもち, ボタンを押すと文字列を表示するアプリを作る. このアプリは,HelloWorld アプリを改造して作成するため, アプリ作成の途中からの手順を示す. 1. ボタンの設置 (1) レイアウトにボタンを追加するパレットの フォーム ウ

Prog2_9th

Taro-twokansu3.jtd

Prog2_2nd

Chapter 2 センサー機能と描画機能 [ カラーボールゲームアプリ ] 2-2 センサー機能について 2-1 アプリケーションの概要 2-2 センサー機能について 0 本章で使用するサンプルアプリは カラーボールゲームアプリ です まずここではアプリの概要について解説します なお 本章で扱う加

MasterDetailFlow SettingsActivity 2. Android Lint Checks 以前のバージョンよりコンパイルのチェックが厳しくなりました このような厳しいチェックを Android Lint Checks と言います Abdroid プログラミング Bible で

Prog2_2nd

Prog2_10th

Prog2_6th

Taro-korattsu.jtd

補足資料 キーイベント処理サンプル package jp.co.keyevent; import android.app.activity; import android.os.bundle; import android.view.keyevent; import android.widget.t

26 editor.putint(pref_count_key, executecount); 27 // 変更した Preference を確定させる 28 editor.commit(); 29 } (c) 実行の様子実装して実行した様子を図 1 と図 2 に示す. 一度実行するごとに, カウン

Prog2_6th

Microsoft Word - Android_SQLite講座_画面800×1280

Prog2_6th

補足資料 インテントによるアプリケーションとアクティビティの呼出し Android アプリのキモとなるインテントとは何? インテント ( 呼び出し要求 ) とは Android 独自の機能です 簡単にいえばアプリケーションや他のアクティビティを呼び出す機能ですが 他のアプリケーションを機能や扱えるデ

日 用 用 面 示 用 用 方

Prog2_12th

授業内容 センサーとは何かおさらい MEMS フレームワークとは何か? を理理解する 演習 センサーのフレームワークを理理解する Androidで使 用できるセンサーの種類 センサーを使ってみる

android2.indd

mazec テクニカルガイド第5版(Android版)

Android でサービスしよう! 日本 Android の会 2 月 21 日大阪セミナ- 有山圭二 ( 有限会社シーリス )

Prog2_10th

Microsoft Word - Android_DI講座_画面800×1280

プロジェクト毎に名前を指定する ( ここでは AndroidTest) 動作可能な最低バージョン メインターゲットのバージョン すべて設定してクリック チェックを外す クリック

スライド 1

Prog2_5th

/03/26 2

日 力力 生 行行 入 入 力力 生 用 方


Prog2_5th

Microsoft PowerPoint - OOP.pptx

Microsoft Word - A05_AndroidプログラミングJUMP_画面800×1280

Android osの歴史 1.6から2.3まで携帯のみ 3.0 タブレットのみ 4.0 タブレットで培ったUIなど の技術を携帯でも 使えるとうにと APIなんかが統合された

Hello, Android

Another Activity オブジェクトは生成されてもいないのである これは 後述の onpause メソッ ドの説明からも明らかである 翻訳 : A の onpause から返ってこない限り B は create されない ため ここで長い処理は行ってはならない 実際にトレースをおこなってみ

非推奨メソッド等の掲載について

10/31 Java AWTの基本構造(Frameクラスの継承) 演習課題資料

Microsoft Word - Android_SQLite講座_画面800×1280

「Android Studioではじめる 簡単Androidアプリ開発」正誤表

Microsoft Word - USB60BCR_10.doc

前回のあらすじ 物理演算ライブラリ chipmunk を使って チキンが地面に落ちるところまで

Javaプログラムの実行手順

Vuzix M100 SDKインストールガイド


Microsoft Word - Android_DI講座_画面800×1280

GUIプログラムⅣ

MOVERIO Pro BT-2000/2200 デベロッパーズガイド 自己診断機能&GPSアシスト

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

1: Preference Display 1 package sample. pref ; 2 3 import android. app. Activity ; 4 import android. content. Intent ; 5 import android. content. Shar

グラフの探索 JAVA での実装

2

教材ドットコムオリジナル教材 0から始めるiアフ リ リファレンス i アプリ簡易リファレンス ver i アプリ Java 独自のメソッド (1)iアプリの命令を使えるようにする import com.nttdocomo.ui.*; (2) 乱数を使う import java.u

プログラミング基礎I(再)

そして 取得した OutputStream インスタンスを使い 文字コードは UTF-8 として PrintWriter インスタンスを生成して あとは PrintWriter.append() で書き込みたい文字 列を渡して close() で保存する というだけです ファイルの読込み方法 それで

Java演習(4) -- 変数と型 --

JavaプログラミングⅠ

Java言語 第1回

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

課題

Microsoft PowerPoint ppt

2-2. TableLayout TableLayout は任意のビューを表形式で配置したい場合に利用する (HTML の Table に近いイメー ジ ) 2-3. FrameLayout ビューを重ねて表示するためのレイアウト 後から配置した部品が前面に来る仕様となっている 3. まとめ レイア

プログラミング入門1

PowerPoint プレゼンテーション

HCI プログラミング 5 回目ウィンドウに画像を表示してみよう 今日の講義で学ぶ内容 画像の表示 画像のエフェクト 画像のビューポート指定 画像の表示 1 画像を表示してみましょう 画像の表示はクラス ImageView により管理されます ソースファイル名 :Sample5_1.java //

JAVA入門

Microsoft PowerPoint - lec06 [互換モード]

Java - Visual Editor

手書認識 グラフ描画 Step2-2 手書認識 : 認識結果を PaintPanel で描画する < 属性付き文字列 AttributedString> 標準出力では分かりにくいうえに認識結果を使えないので 認識するごとに PaintPanel に文字を描画することにする ここで 数式はただの文字列

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

<4D F736F F F696E74202D AC C8899E D834F E >

PowerPoint プレゼンテーション

JavaプログラミングⅠ

基本情報STEP UP演習Java対策

Android Layout SDK プログラミング マニュアル

Java言語 第1回

教材ドットコムオリジナル教材 0から始めるiアプリ (4) 0 から始める i アプリ (4) i アプリをプログラミングする際に必要なのは Java というプログラミング言語の基礎知識です 独自の命令や駆使してプログラミングをするわけですが Java というベースになっている言語を知らないでプログ

Microsoft PowerPoint ppt

PowerPoint プレゼンテーション

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

スライド 1

Microsoft PowerPoint - chap10_OOP.ppt

Microsoft Word - Android_DI講座_画面800×1280

第1章 ビジュアルプログラミング入門

Microsoft PowerPoint - OOP.pptx

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

ウィンドウの構成ウィンドウはタイトルバーとウィンドウ枠からなります タイトルバーには最小化 / 最大化ボタンや閉じるボタンがあります また ウィンドウはクライアント領域をもちます クライアント領域にはボタンなど GUI 部品が配置されます GUI 部品配置 ( レイアウト ) ウィンドウ ( ステー

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

JavaプログラミングⅠ

平成 29 年度卒業研究 初心者のためのゲームプログラミング用 教材の開発 函館工業高等専門学校生産システム工学科情報コース 5 年 25 番細見政央指導教員東海林智也

新・明解Java入門

ガイダンス

SpringSecurity

android2.indd

JAVA とテンプレート

WebOTXマニュアル

Graphical User Interface 描画する

Transcription:

玉転がしタブレット端末の特徴の一つとして, センサを使った動作や, 指による画面操作がある. それらを活用して, 図形を動かすアプリの例を示す. 1. プロジェクトを作る Tama アプリケーションを作る,Tama プロジェクトを作る. 図 1 プロジェクト作成 プロジェクトの構成を設定する. 図 2 プロジェクトの構成 ランチャー アイコンを設定する.

図 3 ランチャー アイコンを設定する BlankActivity を作る. 図 4 Blank Activity を作る BlankActivity の名前を MainActivity とする. 図 5 アクティビティの名前をつける

2. レイアウトを作成する RelativeLayout をレイアウトファイルで定義し, 表示する View をプログラムで作成して設置する. そのため, 標準で作成されるレイアウトを XML 編集画面から削除し, グラフィカル レイアウト画面にて,RelativeLayout を追加する. activity_main.xml を開き,XML 編集タブを開く. 現在書かれている内容を削除する. 図 6 標準のレイアウトを削除する グラフィカル レイアウトタブに切り替えて, パレットの レイアウト から RelativeLayout をアクティブワークスペースにドラッグアンドドロップする. 図 7 RelativeLayout を追加 ここで,RelativeLayout と View にそれぞれ ID をつける. ここでは, wholelayout とする. さらに, センサの値を確認するための,TextView を追加する. その TextView の ID を sensorview とする. 結果として, リスト 1 のような XML ソースになる.

1 2 3 4 5 6 7 8 9 10 11 12 13 リスト 1 XML ファイルの状態 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/wholelayout" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/sensorview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" android:textappearance="?android:attr/textappearancemedium" /> </RelativeLayout> 3. マニフェストファイル縦長の状態で固定させたいので, マニフェストファイルで指定する. AndroidManifest.xml ファイルを開き, 固定したい Activity を選択する.Activity の属性 (Attributes) の中で Screen orientation として portrait を指定する. 図 8 画面の表示方向を指定する 4. Tamaクラス玉を描画する図形を表示するための Tama クラスを作成する. プロジェクトフォルダを右クリックし, 新規 -> クラス を選択する. クラス名を Tama にするので, 名前 を Tama とする. 図 9 クラス名をつける Tama クラスは View クラスを継承するので, スーパークラスの項目の 追加 をクリッ クする.

図 10 継承するクラスの追加 図 11 継承するクラスを追加した様子 Tama.java を開くと,Tama クラス名にエラーが表示されているので, カーソルを合わ せると, 引数が指定されたコンストラクタを定義する必要があることを助言してくれるので,Tama(Context) を選ぶ.

図 12 コンストラクタを定義する 描画するための内容を書き入れる. リスト 2 Tama クラス 1 public class Tama extends View 2 { 3 4 float radius = 100.f; 5 Paint paint = new Paint(); 6 public Tama(Context context) { 7 super(context); 8 } 9 10 // 描画処理を記述 11 @Override 12 protected void ondraw(canvas canvas) 13 { 14 // 描画する色を定義 15 paint.setcolor(color.argb(255, 0, 0, 255)); 16 // 塗りつぶしの円にする 17 paint.setstyle(paint.style.fill_and_stroke); 18 paint.setstrokewidth(0); 19 // 円を描画 20 canvas.drawcircle((int)(radius * 1),(int)(radius * 1), radius, paint); 21 } 22 protected void onmeasure(int width,int height) 23 { 24 super.onmeasure(width, height); 25 26 // View の描画サイズを指定する 27 setmeasureddimension((int)(radius * 2),(int)(radius * 2)); 28 } 29 } 5. MainActivityクラス (1) フィールド MainActivity 内のフィールドをリスト 3 のように設定する. リスト 3 MainActivity クラスのフィールド 1 private SensorManager msensormanager;// センサーマネージャーのオブジェクト 2 private SensorEventListener sensorlistener;// センサーリスナーのオブジェクト 3

4 public Tama tama;// 玉のオブジェクト 5 public Point displaysize;// 玉を表示できる領域を記憶する 6 private RelativeLayout wholelayout;// レイアウトファイルから取得する画面のレイアウト 7 8 public int displayleft; // 図形の左座標 9 public int displaytop; // 図形の上座標 10 public int distancex; // タッチした x 座標と図形の左座標の差 11 public int distancey; // タッチした y 座標と図形の上座標の差 (2) oncreateメソッド MainActivity を表示するときに, 玉を作り, 画面上に表示するように, リスト 4 のように,onCreate メソッドに設定する. なお, 玉には, 玉をタッチにより移動するためのリスナを設定する. リスト 4 MainActivity クラスの oncreate メソッド 1 public void oncreate(bundle savedinstancestate) 2 { 3 super.oncreate(savedinstancestate); 4 setcontentview(r.layout.activity_main); 5 6 // 画面サイズを取得する 7 WindowManager wm = (WindowManager) getsystemservice(window_service); 8 Display disp = wm.getdefaultdisplay(); 9 displaysize = new Point(); 10 disp.getsize(displaysize); 11 12 //Tama オブジェクトをインスタンス化する 13 tama = new Tama(this); 14 //Tama オブジェクトにタッチしたときのリスナーを設定する 15 tama.setontouchlistener(new View.OnTouchListener() 16 { 17 public boolean ontouch(view view, MotionEvent event) 18 { 19 switch (event.getaction()) 20 { 21 // 動かしたときの動作 22 case MotionEvent.ACTION_MOVE: 23 displayleft = (int) event.getrawx() - distancex; 24 displaytop = (int) event.getrawy() - distancey; 25 26 // 玉を移動させる 27 view.layout(displayleft, 28 displaytop, 29 displayleft + view.getwidth(), 30 displaytop + view.getheight()); 31 break; 32 33 // タッチした時の動作 34 case MotionEvent.ACTION_DOWN: 45 // 図形の左上座標とタッチ座標の差分をとる 36 distancex = (int) (event.getrawx() - view.getleft()); 37 distancey = (int) (event.getrawy() - view.gettop()); 38 break; 39 40 // 指を離したときの動作 41 case MotionEvent.ACTION_UP: 42 break; 43 }

44 return true; 45 } 46 }); 47 48 // 起動時に図形を置く場所を指定する 49 displayleft = displaysize.x / 2; 50 displaytop = displaysize.y / 2; 51 52 // 図形を移動する 53 tama.layout(displayleft, 54 displaytop, 55 displayleft + tama.getwidth(), 56 displaytop + tama.getheight()); 57 58 // 画面に Draw オブジェクトを表示する 59 wholelayout = (RelativeLayout) findviewbyid(r.id.wholelayout); 60 wholelayout.addview(tama); 61 } (3) oncreateoptionsmenuメソッド メニューを表示するメソッドを定義する. ここでは, デフォルトのままにする. リスト 5 MainActivity クラスの oncreateoptionsmenu メソッド 1 @Override 2 public boolean oncreateoptionsmenu(menu menu) 3 { 4 // Inflate the menu; this adds items to the action bar if it is present. 5 getmenuinflater().inflate(r.menu.main, menu); 6 return true; 7 } (4) onstopメソッド アクティビティが止まった時にセンサの変化に対する監視を解除するため,onStop メ ソッドにてリスナを解除する. リスト 6 MainActivity クラスの onstop メソッド 1 protected void onstop() 2 { 3 // TODO Auto-generated method stub 4 super.onstop(); 5 // Listener の登録解除 6 msensormanager.unregisterlistener(sensorlistener); 7 } (5) onresumeメソッド MainActivity を起動する際に実行される onresume にて, センサから値を取得する処理 と, センサを監視して, センサの値が変わったときに処理する内容を定義する. センサに対して,sensorListner オブジェクトをリスナーとして設定する. 1 @Override 2 protected void onresume() 3 { 4 super.onresume(); 5 リスト 7 MainActivity クラスの onresume メソッド

6 // センサーの情報を取得するためのセンサーマネージャーを立ち上げる 7 msensormanager = (SensorManager) getsystemservice(sensor_service); 8 9 // センサーが変化したときの処理内容が含まれたクラスをインスタンス化する 10 sensorlistener = new RotationSet(this); 11 12 // 加速度センサの取得 13 List<Sensor> list = msensormanager 14.getSensorList(Sensor.TYPE_ACCELEROMETER); 15 if (list.size() > 0) 16 { 17 Sensor _accelerometer = list.get(0); 18 // SensorEventListener を登録 19 msensormanager.registerlistener(sensorlistener, 20 _accelerometer, 21 SensorManager.SENSOR_DELAY_UI); 22 } 23 24 // 地磁気センサの取得 25 List<Sensor> list2 = msensormanager 26.getSensorList(Sensor.TYPE_MAGNETIC_FIELD); 27 if (list2.size() > 0) 28 { 29 Sensor _magneticfield = list2.get(0); 30 // SensorEventListener を登録 31 msensormanager.registerlistener(sensorlistener, 32 _magneticfield, 33 SensorManager.SENSOR_DELAY_UI); 34 } 35 } (6) onwindowfocuschangedメソッド ナビゲーションバーを除いた表示領域を取得したいので, 表示する MainActivity にフ ォーカスがきまり,View の表示が定まった時点で, 表示画面のサイズを取得する. リスト 8 MainActivity クラスの onwindowfocuschanged メソッド 1 public void onwindowfocuschanged(boolean hasfocus) 2 { 3 super.onwindowfocuschanged(hasfocus); 4 5 wholelayout = (RelativeLayout) findviewbyid(r.id.wholelayout); 6 displaysize.x = wholelayout.getwidth(); 7 displaysize.y = wholelayout.getheight(); 8 } 6. RotationSetクラス以下のようにセンサに設定する, リスナにするためのクラスを RotationSet クラスとして定義する. msensormanager.registerlistener(sensorlistener, _accelerometer, SensorManager.SENSOR_DELAY_UI); リスト 9 RotationSet クラス 1 public class RotationSet implements SensorEventListener

2 { 3 private boolean MagneticSensorReady; 4 private boolean AccerelateSensorReady; 5 float magneticvalues[] = new float[3]; 6 float accelerometervalues[] = new float[3]; 7 8 // センサによる X-Y の移動量 9 public int diffx, diffy; 10 11 MainActivity activity; 12 13 RotationSet(MainActivity activity) 14 { 15 this.activity = activity; 16 } 17 18 @Override 19 public void onsensorchanged(sensorevent event) 20 { 21 /* 回転行列 */ 22 float rotation_matrix[] = new float[16]; 23 /* 傾斜行列 */ 24 float inclination_matrix[] = new float[16]; 25 /* 向き */ 26 float orientation_matrix[] = new float[3]; 27 28 // センサごとに値を取得する 29 switch (event.sensor.gettype()) 30 { 31 // 地磁気センサのとき 32 case Sensor.TYPE_MAGNETIC_FIELD: 33 magneticvalues = event.values.clone(); 34 MagneticSensorReady = true; 35 break; 36 // 加速度センサのとき 37 case Sensor.TYPE_ACCELEROMETER: 38 accelerometervalues = event.values.clone(); 39 AccerelateSensorReady = true; 40 break; 41 } 42 43 // 地磁気センサと加速度センサの値が両方取得できたら 44 if (AccerelateSensorReady && MagneticSensorReady) 45 { 46 AccerelateSensorReady = false; 47 MagneticSensorReady = false; 48 49 // 加速度センサと地磁気センサから, 回転行列と傾斜行列を得る 50 SensorManager.getRotationMatrix(rotation_matrix, 51 inclination_matrix, 52 accelerometervalues, 53 magneticvalues); 54 // 画面の回転状態に応じて, 座標を変換する 55 getorientationasrotation(rotation_matrix, orientation_matrix); 56 57 58 TextView tv = (TextView)activity.findViewById(R.id.sensorView); 59 tv.settext( "Z:" + Math.toDegrees(orientation_matrix[0]) + " n"+ 60 "Y:" + Math.toDegrees(orientation_matrix[1]) + " n"+ 61 "X:" + Math.toDegrees(orientation_matrix[2]) ); 62 63 // 回転角の値をトリガに移動量を決める 64 diffx = (int) Math.toDegrees(orientation_matrix[2]) * (-5);

65 diffy = (int) Math.toDegrees(orientation_matrix[1]) * (5); 66 67 68 // 画面からはみ出ないように調整する 69 if (0 <= activity.displayleft - diffx 70 && activity.displayleft - diffx 71 < (activity.displaysize.x - activity.tama.getwidth())) 72 { 73 activity.displayleft -= diffx; 74 } 75 else if (activity.displayleft - diffx < 0) 76 { 77 activity.displayleft = 0; 78 } 79 else if ((activity.displaysize.x - activity.tama.getwidth()) 80 < activity.displayleft - diffx) 81 { 82 activity.displayleft = activity.displaysize.x - activity.tama.getwidth(); 83 } 84 85 if (0 <= activity.displaytop - diffy 86 && activity.displaytop - diffy 87 < (activity.displaysize.y - activity.tama.getwidth())) 88 { 89 activity.displaytop -= diffy; 90 } 91 else if (activity.displaytop - diffy < 0) 92 { 93 activity.displaytop = 0; 94 } 95 else if (activity.displaysize.y - activity.tama.getwidth() 96 <= activity.displaytop - diffy) 97 { 98 activity.displaytop = (activity.displaysize.y - activity.tama.getwidth()); 99 } 100 101 // 玉を移動させる 102 activity.tama.layout(activity.displayleft, 103 activity.displaytop, 104 activity.displayleft + activity.tama.getwidth(), 105 activity.displaytop + activity.tama.getheight()); 106 } 107 } 108 109 public void getorientationasrotation(float[] rotate, float[] out) 110 { 111 // ディスプレイを取得する 112 Display disp = activity.getwindowmanager().getdefaultdisplay(); 113 // 標準状態からのディスプレイの角度を求める 114 int dispdir = disp.getrotation(); 115 116 // 画面回転してない場合はそのまま 117 if (dispdir == Surface.ROTATION_0) 118 { 119 SensorManager.getOrientation(rotate, out); 120 } 121 else 122 { 123 float[] outr = new float[16]; 124 125 switch(dispdir) 126 {

127 case Surface.ROTATION_90: 128 129 SensorManager.remapCoordinateSystem(rotate, 130 SensorManager.AXIS_Y, 131 SensorManager.AXIS_MINUS_X, 132 outr); 133 break; 134 case Surface.ROTATION_180: 135 136 float[] outr2 = new float[16]; 137 SensorManager.remapCoordinateSystem(rotate, 138 SensorManager.AXIS_Y, 139 SensorManager.AXIS_MINUS_X, 140 outr2); 141 SensorManager.remapCoordinateSystem(outR2, 142 SensorManager.AXIS_Y, 143 SensorManager.AXIS_MINUS_X, 144 outr); 145 break; 146 case Surface.ROTATION_270: 147 SensorManager.remapCoordinateSystem(rotate, 148 SensorManager.AXIS_MINUS_Y, 149 SensorManager.AXIS_X, 150 outr); 151 break; 152 } 153 SensorManager.getOrientation(outR, out); 154 } 155 } 156 157 @Override 158 public void onaccuracychanged(sensor sensor, int accuracy) 159 { 160 // TODO 自動生成されたメソッド スタブ 161 } 162 }

7. 実行する