ストップウォッチを例題にTimer処理のポイントを3つ、紹介します。, Androidでもjava.util.Timerが利用可能です。 startLabel.setVisibility(View.INVISIBLE); if (boxY > frameHeight – boxSize) boxY = frameHeight – boxSize; 「わかりやすく・シンプル」をモットーに、スマホアプリ・ウェブアプリの作り方を紹介します。 独学でプログラミングを勉強をしている方、基礎は勉強したけれど次に何をすれば良いか分からない...という方のお役に立てるサイトを目指しています, 大学中退→オンライン講座と書籍でプログラミング学習→フリーランス。現在はプログラミング講座を作ったりアプリ開発をしています。, 「わかりやすく・シンプル」をモットーに、携帯アプリ・ウェブアプリの作り方を紹介します。, 当サイトでは、できる限り簡単・シンプルにするために、簡略化できるコードを簡略せずに書いたり、専門用語を使わずに進めている箇所があります。, * onCreate 内の startLabel.setVisibility(View.INVISIBLE); とタイマー処理は削除してください。, 【Android Studio】 ゲームアプリ開発入門 第4回 「タイマーで画像を動かす」, https://codeforfun.jp/wp-content/uploads/2019/02/ctb-4-1.mp4, https://codeforfun.jp/wp-content/uploads/2019/02/ctb-4-2.mp4, https://codeforfun.jp/wp-content/uploads/2019/02/ctb-4-3.mp4, TECHNICAL MASTER はじめてのAndroidアプリ開発 第3版 AndroidStudio3対応, [改訂新版]Android SDKポケットリファレンス (POCKET REFERENCE). google_ad_slot = "7813627462"; では、その使い方を紹介します。以下のコード … デーモンスレッドとは、プログラム終了時にスレッドの実行終了を待ちません。 google_ad_width = 300; // ]]> AndroidのHandlerとは何か? //
(例外で終了してしまうはずです), 強制終了を防いでいるのが、6行目mHandler.post();です。
プログラム終了のタイミングでデーモンスレッドの処理は中断され、終わることになります。 ブログを報告する, 既存アプリにバナー広告を追加して表示する 今回は既存のアプリにバナー広告を追加する方法の説明です。 …, インテントサービスとは? インテントサービスは停止するまでバックグラウンドで動き続ける通常のサービス…, リストビューに一覧表示したサウンドをタップ操作で再生させる方法リスト表示したサウンドを再生させる 今…, setAlarmClock とは? setAlarmClock は AlarmClockInfo でスケジュールされた時間に指定のペンディングイ…, カレンダー「Calendar」とは? カレンダーは、セットした日時の「1970年1月1日00:00:00 GMT からの経過時…, AlarmManagerクラスのリピート間隔 AlarmManagerクラスには、指定した間隔で繰り返しアラームを発報するこ…, Android 9「フォアグラウンドサービス」の変更点 Android 9 以降は「フォアグラウンドサービス」を使用す…, ブロードキャストレシーバーのエラー ブロードキャストレシーバー(BroadcastReceiver)を使ったアプリを…, 新しいアクティビティを開始する 新しいアクティビティを開始するには「startActivity()」メソッドを使い…, 現在のアクティビティを終了する 現在のアクティビティを終了するには「finish()」メソッドを呼び出します…, 「通知」を発行する方法 今回は、画面の上部にある通知領域に「通知」を発行して表示する方法です。APIレ…, アクティビティを持たないウィジェット アクティビティを持たないウィジェットは、そのままでは実行やイン…, タップで画像が切り替わるウィジェット 今回はウィジェットをタップするとその中に配置してある ImageView…, ビットマップ画像を中心を軸に拡大・縮小する 今回は、オリジナルの View(MyScale.class)に配置したビッ…, ビットマップ画像を連続回転させながら移動する 今回は、オリジナルの View(MyNewViewView.class)に配置…, マトリックスでビットマップ画像を連続回転させる 今回は、オリジナルの View(MyNewView.class)に配置し…, 画面の回転に対応する方法 アンドロイドアプリは画面を回転(横位置 ⇔ 縦位置)させると、自動でアクティ…, レイアウトエディタのプレビュー表示が変わった Android Studio 3.3 になって「レイアウトエディタ」のプ…, 端末のバッテリー充電レベルを監視する バッテリーの充電レベルを監視するには、バッテリーの充電レベルが…, ブロードキャストレシーバーの使い方(その2) ブロードキャストレシーバーは端末が発信している様々なメ…, 【暗黙の仕様】AlarmManager のリピート間隔を「1分以下」にすることは不可能, 【Android 9】requires android.permission.FOREGROUND_…, ブロードキャストレシーバーに「has no zero argument constructor」とい…, アクティビティを持たないウィジェットを実行(インストール)できるようにする設定手順, Android Studio 3.3 の「レイアウトエディタ」のプレビュー表示を以前の状態に戻す方法. タイマーやストップウォッチはchronometerを使えば簡単にできますが、自由度があまりありません。カウントアップ専用のTimerTaskを使えば100msec刻みのタイマーが作れます。 最後に3.Androidの描画モデルについて解説します。, スレッドとは処理の単位のことです。AndroidのActivityに関する処理は通常mainスレッドで動作しています。 動画では Android Studio 3.1.4 を使用していますが 3.6 / 4.0 でも動作確認済みです。, MainActivity.java を開いて、4・5行目と18~28行目を追加します。, 新しい TimerTask を作成して、run() メソッドを用意します。run() メソッドの中には繰り返し実行したい処理を書きます。, 繰り返し実行する処理は changePos() メソッドです。(この後書いていきます。), 20 ミリ秒毎に changePos() メソッドを呼び出して画面を更新していきますが、Android 開発では「メインスレッド外で UI を変更することはできない」という決まりがあります。, 言い換えると「TimerTask からはスコアラベルを更新できない」ということです。, handler.post で UI スレッドに Runnable を渡して UI を更新するという方法で、changePos() メソッドを実行します。, Handler を使わないと Only the original thread that created a view hierarchy can touch its views.
画像はサンプルコードのストップウォッチ(停止状態)です。, 上記の例ではスレッド<1>がmainスレッドでActivityはシングルスレッドの状態だということがわかります。 16行目のmTextView.setText();は描画の更新処理を含むため、UI Thread以外で呼び出すとシングルスレッドモデルに反します。 さきほどでてきた、mainスレッドはユーザスレッドです。, プログラム終了にあたっては、すべてのユーザスレッドできちんと終了処理がハンドリングできていないといけません。
インスタンスを新しく作り直しているのは、cancel()メソッド実行後はTimerクラスの資源が破棄されていて、
(サンプルでは、mTimer.schedule( timerTask, 100, 100);として100ms単位で実行), 4行目のrun()メソッド内部が、更新処理です。 // , vw-dsgさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog http://www.adamrocker.com/blog/261/what-is-the-handler-in-android.html, など上記のコードを使わずに、以下のようにTimerTaskインスタンスを直接生成する場合が多いです。, コードとしては若干見にくいかもしれませんが、MyTimerTaskを作らずに記述できます。 scheduleAtFixedRateメソッドを使った方が厳密でよかった、ということがわかります。, ボタン押下時の初期化処理で毎回timerTask = new MyTimerTask、mTimer = new Timer(true)と、 今回は定期実行に便利なタイマーです。 [CDATA[
(ユーザスレッドが生き残っている間は、プログラム実行状態です) google_ad_client = "ca-pub-3961276242716394"; 「Timer」関数を使うと一定の間隔で処理を繰り返し実行させることができるので便利です。しかし、毎回僅かな遅延(1000分の数秒ほど)が発生しているので注意が必要です。それは、繰り返しの回数が増えれば増えるほど誤差が大きくなるからです。, タイマーを使い1秒間隔でカウントをアップし、それと同時にシステム時間を取得してログに出力しています。, 右端の数値が増えているので、毎回(1秒間隔)のように 1000分の数秒の遅れが発生しているというのがわかる。, 単純にカウントをアップして1/1000秒単位のストップウォッチを作ろうとタイマー処理の間隔を「1ms」に設定しても、毎回のように1000分の数秒の遅延が加算されているので1000回のカウントが1秒(1000ms)ということにはなりません。, 簡単に一定の間隔で処理を実行できるタイマー機能ですが、毎回僅かな遅延が発生しているということを考慮して処理を考えなければなりませんね。, //
[CDATA[ google_ad_client = "ca-pub-3961276242716394"; 広告を非表示にする.
【Android Studio】 ゲームアプリ開発入門 第4回 「タイマーで画像を動かす」 Sara 2019年2月2日 / 2020年9月3日. というエラーメッセージが表示されます。, *このエラーは API 26 以上のエミュレーター・実機では表示されませんが、API 25 以下の場合はアプリが強制終了となるので注意してください。, 先ほど用意したタイマーで定期的に実行する changePos() メソッドを書きます。, 5~7行目を追加して、onTouchEvent 内の box.setY(boxY); は削除します。, まず「画面をタップしているか、画面に触れていないか」を判定するために action_flg を用意しました。, 原因は onCreate() でタイマーをスタートしていることで、青いボックスが下に落ち続けてしまっているからです。画面をタップし続けると上がってきます。, onTouchEvent を以下のように書き換えます。 * onCreate 内の startLabel.setVisibility(View.INVISIBLE); とタイマー処理は削除してください。, ゲームが始まって start_flg が true になると、21~27行目の action_flg の判定処理が行われるようになります。, TextView や ImageView などの要素を非表示にしたい場合は、setVisibility メソッドを使います。INVISIBLE は非表示にするだけ、GONE は完全に消すという違いがあります。, どちらを使っても問題ありませんが、ゲームが始まったら startLabel は不要なので GONE で完全に消してしまいましょう。, 今のままでは、青いボックスが画面の外に移動できてしまいます。 次はここを修正していきましょう。, 青いボックスの画像は正方形なので box.getHeight() で高さだけ取得しています。, 「どうして FrameLayout のサイズを onCreate 内で取得しないのか?」と思われる方がいるかもしれません。, ビューの描画が完了していない状態で frameLayout の高さや画像サイズを取得しようとしても 0 が返ってきてしまいます。, そのため、ビューの描画が確実に完了している onTouchEvent 内でサイズを取得しました。, boxY が 0 より小さくなった場合は、青いボックスが frame の外に出ている状態です。, 青いボックスが画面の一番下にある時、boxY は frame の高さからボックスの高さを引いた値になります。, これ以上 boxY の値が大きくなると画面から出てしまうので、frameHeight – boxSize よりも大きくならないようにします。, 上手く動かなかった場合は、一番下にここまでのコードを貼っているので確認してみてください。, 少しずつゲームらしくなってきましたね! 次回は、オレンジ・ピンク・ブラックボールを動かしていきます。, 独学でプログラミングを勉強するのは難しそう、効率的にプログラミングを学びたいという方はオンラインスクールがオススメです。, 自分にあったスタイルを見つけるために、無料体験のご利用をオススメします。(無料体験後に自分には合わないなと感じたらハッキリ断ってしまって問題ありません。) 個別サポートもプログラミング学習に挫折しないために重要なポイントです。エラーや困った時にすぐに個別対応をしてくれるスクールを利用して下さい。. (Binderはまた、別の機会に紹介したいと思います), スレッドの種類は2つに分類されます。 プログラムを終了しようとしても、ユーザスレッドの処理が終わる(returnされる)まで終了できません。 タイマーは別スレッドで実行することを思い出してください。
関連記事 2019-01-19 画面の回転(縦位置 ⇔ 横位置)に対応する方法. シングルスレッドモデルと呼ばれています。
9; 1; ここまでの記事はこちら . 周期的(10秒ごとなど)にイベントを発生させたい場合は CountDownTimer というクラスを使います。複数起動でき、カウントする時間間隔も設定することが可能です。 カウントタイマーの使い方. (実際には描画に関わるmTextView.setText() の部分だけpostすれば良いのですが、ここでは簡単化のため、すべての処理をUI Threadにお願いしました), Handlerについては、adamrockerさんのWebサイト、throw Lifeにわかりやすい解説があります。 前回はタップするたびに青いボックスを少しだけ上に動くようにしました。 今回はタイマーを使って. // ]]> scheduleAtFixedRateメソッド:初回のタスク実行時間を基準にperiodミリ秒 x n回後が次のタイミング オンライン完結で勉強できるスクールで、コースがとても充実しています。チャットで質問すればすぐに回答を得られるのが一番のおすすめポイントです。オリジナルのサービスやアプリの開発もサポートしてくれるので、開発したいものが決まっている人にもオススメです。, 一対一で受講できる個別指導のプログラミングスクールです。Webデザイン・Webサービス開発・アプリ開発などを幅広く学習することができます。マンツーマンなので自分のペースで学習できて、質問もその都度できるのがメリットです。, 英語でも良い、英語とプログラミングを同時に勉強したいという方は Treehouse がオススメです。月25ドルで始めることができて、たくさんのプログラミング言語を学ぶことができます。 個別サポートはありませんが、掲示板が充実しています。ほとんどの場合、質問してから30分程度で回答を得ることができます。, 【Android Studio】ゲームアプリ開発入門 #4 青いボックスを上下に動かす, schedule(TimerTask task, long delay, long period). 画面の回転に対 … 両方の記法を覚えておけば便利です(どちらが良いかは用途、意図に依存するとおもいます)。, Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org, 「設計に関する議論の土台となる本を」という著者陣の熱い思いから、ついにAndroidアプリ設計の決定版が登場!, AndroidモダンプログラミングはKotlin&Gradleを特集した解説書です。改訂版Gradle逆引きリファレンス(Android Gradle Plugin 3.0.x対応)など開発に使える技術を中心に解説をお届けします, The Web Explorer 4はWebページの表示速度向上の取り組み、AngularやReact NativeなどWebの冒険者にふさわしい内容です, ConstraintLayoutやreCAPTCHA、Kotlinやドメインを考慮した設計技法、Google I/Oセッションレポートの全13章を収録, わかる! ドメイン駆動設計はソフトウェア設計手法であるドメイン駆動設計(DDD)の解説書です. ここでは3つのオンラインスクールを紹介します。 全て無料体験がありますので、ぜひ自分に合ったスクールを見つけてみて下さい???? 引数をtrueで与えると、デーモンスレッドとして実行できます。, 今回のサンプルコードは、ストップウォッチです。サンプルコード(下図)は、経過時間、スタートボタン・ストップボタンで構成されています。, まず、はじめにストップウォッチのStartボタン、Stopボタン、テキスト表示領域を組み立てます。, 01~03行目、TextViewやButton、経過時間を入れる変数mLaptimeをActivityのメンバとして保持します。 Handlerは、シングルスレッドモデルを守るための仕組みで、UI Thread(mainスレッド)に対して描画処理をポストしています。 << Android-Note. // ]]>, //