AnimationDrawable 静止画を使ったアニメーション

静止画像(pngなどの画像リソース)を用意してパラパラ漫画の要領でアニメーションさせるには、AnimationDrawableクラスを利用します。 Android APIs Reference – AnimationDrawable 文字が変わってるだけですが、3つの画像でアニメーションしてます。画像を準備するのが面倒くさかったので、文字だけの画像を使いました。 アニメーションに使う静止画像 画像は解像度に合わせてres/drawable/hdpiなどのディレクトリに用意します。 今回はanime_test1.png,anime_test2.png,anime_test3.pngの3つの画像ファイルを用意しました。画像と言いつつ数字の1,2,3が書かれているだけの画像です。 ちなみにファイル名として使えるのは小文字のアルファベット、数字、アンダースコア(_)とドット(.)のみです。それ以外の文字(大文字アルファベットなど)を使うと以下のようにコンパイルエラーとなります。 Invalid file name: must contain only lowercase letters and digits ([a-z0-9_.]) アニメーション設定のXMLファイル どの画像を何秒間表示させるのかという設定をXMLファイルに記述します。今回はres/drawable/test_animation.xmlというファイル名にしました。 <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/anime_test1" android:duration="500"/> <item android:drawable="@drawable/anime_test2" android:duration="500"/> <item android:drawable="@drawable/anime_test3" android:duration="500"/> </animation-list> android:oneshot=trueで、アニメーションを1回のみ再生する設定になります(最後の画像でアニメーションが止まる)。falseだとループ再生されます。 アニメーションを再生する test_animationは何もしなければ単なる静止画と同じで、Drawableとして扱うことができます。ImageViewのsrc属性に設定したり、TextViewのbackground属性に設定したりすることができます。 今回はImageButtonに上記で作成したdrawableを設定してやり、ボタンを押したらアニメーションが再生されるようにしてみます。 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/image_button" android:src="@drawable/test_animation" /> </RelativeLayout> APIリファレンスではandroid:background属性に設定していますが、これはandroid:src属性に設定しても動きました。src属性にAnimationDrawableを設定した場合、getBackground()ではなくgetDrawable()でAnimationDrawableを取得します。 MainActivity.java(onCreateを抜粋) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageButton imageButton = (ImageButton) findViewById(R.id.image_button); final AnimationDrawable animationDrawable = (AnimationDrawable) imageButton.getDrawable(); imageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { animationDrawable.start(); } }); } AnimationDrawableを取得して、start()メソッドを呼び出せばアニメーションさせることができます。 ただしできるのは再生するか停止するかくらいで、逆再生したりはできないみたいです。

Android Support LibraryのソースコードをGrepCodeを使って確認する

Android Support LibraryのソースコードはAndroid Studioで確認することができません 例えば、android.support.v7.app.ActionBarActivityのソースコードを確認したいとしましょう。その場合、調べたいクラスをCmd+クリックすることで、対象のクラスのソースコードに自動的にジャンプできます。 しかし、サポートライブラリについてはソースコードまでは見つかりません。 ちなみにAndroid SDKのクラスであれば、SDKマネージャーでソースコードまでダウンロードしていれば確認することができます。例えばBundleクラスのソースコードは以下のように確認できます。 サポートライブラリのソースコードを確認するのは、Gitを使ってGoogleのリポジトリから拾ってくる方法もありますが、今回はWebサービスのGrepCodeを利用してみます。 GrepCodeにアクセスして、検索したいクラスを入力します。(今回の場合はandroid.support.v7.app.ActionBarActivity) すると検索結果が表示されるので、調べたいクラスのバージョンを選択します。 他のバージョンとの差異をDiffで確認できるので、バージョンアップでどこが変更されたのかを調べるのにはちょうどいいかもしれません。

Android Studioのプレビュー画面でActionBarが表示されないと勘違いした話

最近Android Studioを使ってプロジェクトを作った際に、ActionBarが表示されていないことが気になっていました。 以前までだと、特に何もしなくとも表示されていたはずのActionBar。自分でも特にActionBarのためにコードを書いたり、XML書いたりした覚えがないので、どうすればいいのやらサッパリでした。 実際にはタイトルバーの部分にアプリアイコンが表示されなくなってるだけであって、ActionBarがなくなっているわけではありません。画面のプレビューではActionBarが表示されなくなっていたせいで、私が勘違いしていただけでした。 上記の画像は、両方共ソースコードに変化はありませんが、targetSdkVersionと利用するサポートライブラリのバージョンが異なるものです。 左がtargetSdkVersionが20、app/build.gradleのdependanciesで利用するサポートライブラリのバージョンをcom.android.support:appcompat-v7:20.+と指定したもの。 右はAndroid Studio 1.0の新規プロジェクト作成ウィザードで作られたデフォルトの状態のもの。(targetSdkVersion21,com.android.support:appcompat-v7:21.0.3) API21(Lolipop)からMaterial Designが導入されたことによる影響なんでしょうね。新しく導入されたToolBarを使えということなんでしょうが、使い方がよく分からず苦戦中です。 ちなみに右の状態でも、エミュレーターで実行するとちゃんとActionBarが表示されます。(ただし従来のようなアプリアイコン+タイトルの表示ではありません) ToolBarのClass Overviewに以下の記述があり、Lolipop以降では従来のアプリケーションアイコン+タイトルはやめろってことなんでしょうね。 In modern Android UIs developers should lean more on a visually distinct color scheme for toolbars than on their application icon. The use of application icon plus title as a standard layout is discouraged on API 21 devices and newer. 確かにマテリアルデザインで設計された画面の中でアプリアイコンがぽつんとあると、浮いた感じがして気持ち悪い気もしてきました。 それにしてもデザインに対するハードルがどんどん上がっていって辛い・・・。

AndroidのOSバージョンとコードネームとAPIの一覧表

私は未だにAndroidのOSバージョンとAPIの数字とコードネームが結びついていません。最新の5.0がAPI21で、Lolipopだというのは分かるんですけどね。 ソースコードを読んでいて、JBとかICSとか出てきて「それバージョンで言うとどこ?」と混乱したのでまとめておくことにしました。 バージョン コードネーム api 5.0.1 Lolipop 21 4.4w Android L Preview 20 4.4 KitKat 19 4.3 Jelly Bean 18 4.2.x 17 4.1.x 16 4.0.3〜4.0.4 Ice Cream Sandwich 15 4.0〜4.0.2 14 3.2 Honeycomb 13 3.1 12 3.0 11 2.3.3〜2.3.7 Gingerbread 10 2.3〜2.3.2 9 2.2 Froyo 8 2.1 Eclair 7 2,0.1 6 2.0 5 1.6 Donut 4 1.5 Capcake 3 1.1 2 1.0 1 Android Studioのデフォルトでは、API10〜21をサポートするようにプロジェクトが作成されます。2.3.3までサポートするということですね。 ちなみにOSバージョンごとのシェアはAndroid DevelopersのDashbordsで公開されています。(2.2以降のバージョンのみですが) コードネームの頭文字がAから順番につけられているので、それを押さえていれば大体どのあたりのバージョンなのか検討がつくかもしれません。

設計方法を学ぶ必要性をひしひしと感じる

今までプログラムの全体像を頭の中でイメージし、後は勢いでコーディングして完成させるという作り方をしてきていました。大規模なプログラムを作ることがなかったので、今まではそれで何とかなっていたのですが、最近それも限界を感じています。 Androidのアプリを作るのに、画面がどう遷移してどういう処理が必要で・・・なんていうことを頭の中だけでは把握できません。 それに勢いだけでコーディングしていると、このクラスが一体何の働きをしているのかが分からなくなってきます。作成中はまだ大丈夫なのですが、時間が経つともうわけがわからなくなります。 1分間タイマーは勢いだけで作り上げましたが、もう機能修正とか追加とかやりたくありません。どこで何やっているか自分でも訳がわからないからです。 そんなわけで、設計方法を学ぼうかななんて思って行動を始めました。 頭の中だけでプログラムをイメージするのには限界があるので、少なくとも設計図を用意したい。設計図を作るには、どういうふうにプログラムを組み上げていくのがいいのか、その手法を知る必要がある。という感じです。 とりあえずUMLの書き方さえ知らないので、UMLの入門書を読んで、ついで実践UMLという本を図書館で借りてきて読みました。 とりあえずわかったのはこんな感じですかね。 UMLが書けることとクラス設計ができることは別の話 最初に完璧な設計書を用意するという考えは間違ってる とりあえずやってみないと始まらない UMLの書き方をマスターしたからといって、それだけでは設計書を作ることはできません。個人開発で使う分には、最低限自分が分かればいいので、細かいUMLの書き方をマスターしようとするのはちょっと脱線しすぎかもしれません。 プログラムの設計図を完璧に仕上げてからコーディングをしていくというのはウォーターフォール的発想だからやめろと実践UMLには書いてありました(意訳)。オブジェクト指向開発的には、もっとフレキシブルに設計とコーディングを行き来しながら開発していくんだそうで。 確かに、どういう作りにすればいいのかと完璧な設計を求めるあまりに、プログラムが完成しなければなんのための設計なんだという話になりますもんね。まあ今の私がそうなんですけど。 実践UMLを読んで感じたのは、内容がかなり濃い&難しいので、とりあえず前半くらいの内容を利用して実際に設計→コーディングのサイクルを回していくのがいいのだろうと思いました。どう作っていけばスマートなのかを考えだすとキリがないので、とりあえずやってみなければ始まらない。 アプリの機能、要件を定義して、そこからどういうクラスが必要なのかを検討して、実際に作ってみる。上手くいかなければ設計しなおして、やり直す。もっといい作り方がないかなとか追い求めると何もできなくなってしまうので、とりあえず作る。そんな方針で進めてみようと思います。 それと並行して設計方法についても勉強したいなと思っています。何かおすすめがあれば教えていただきたいです。 実践UML 第3版 オブジェクト指向分析設計と反復型開発入門

MacをYosemiteにバージョンアップしたらAndroid Studioが起動しなくなった

MacをYosemiteにバージョンアップしたらAndroid Studioが起動しなくなりました。 原因はYosemiteへのアップデートでJDK 1.6が消えてしまったことが原因のようでした。(消えたのか参照できなくなったのかはよく分かりませんが・・・) ターミナルで/usr/libexec/java_home -v 1.6と打つと、Unable to find any JVMs matching version “1.6”.と表示されました。JDK 1.7と1.8はバージョンアップ前と同じように存在してくれてましたが、1.6だけ参照できなくなってました。 対策はJDK 1.6(Java 6)を再インストールすればOKです。JDK1.6(Java 6)はこちらからダウンロードできます。

Android StudioでRobolectricを使いJUnit4によるユニットテストを行う

Android StudioでJunit4を使ったテストを実行する方法は、今のところ2通りあるみたいです。 TestRunnerを指定して行う(android-junit4を使う) Robolectricを使う TestRunnerを指定した方法だと、IDEでテストの実行結果が確認できるので便利です。ただし、設定がややこしいのが不便なところです。簡単に取り込める方法があれば教えて欲しいです。 対してRobolectricを使う場合は、テストの実行結果をブラウザで確認しなければならないというデメリットはありますが、導入方法が比較的簡単です。今回はRobolectricを使ってJunit4によるユニットテストを実施する手順を紹介します。 Qiitaのこちらの記事があってようやくまともに入れることができました。感謝感謝。 1. プロジェクトを作成する Android StudioのメニューからFile > New Projectを選択し、新規プロジェクトを作成します。単にプロジェクトを作成するだけです。別に既存のプロジェクトを使うなら飛ばして問題無いです。 2. build.gradleの編集 プロジェクトルートのbuild.gradleにclasspath 'org.robolectric:robolectric-gradle-plugin:0.13.+'を追記します。(app/build.gradleではないです) // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:0.13.2' classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } 新規プロジェクトの場合、build.gradleがこうなればOKです。(この例ではAndroid Studio 0.8.14を使っています) 3. app/build.gradleの編集 やることは3つです。 apply plugin: ‘robolectric’の追加 dependenciesの追加 robolectricディレクティブの追加 apply pluginの追加 app/build.gradleの2行目(apply plugin: 'com.android.application'のすぐ下)にapply plugin: 'robolectric'を追加します。 dependenciesの追加 RobolectricとJunit4を追加をします。 androidTestCompile 'org.robolectric:robolectric:2.3' androidTestCompile 'junit:junit:4.11' robolectricディレクティブの追加 robolectric-gradle-pluginのサンプルを利用してコピペします。 そのままだとGradle Syncがうまくいかないので、一部削除しています。 robolectric { // configure the set of classes for JUnit tests include '**/*Test.
Read full post gblog_arrow_right

Android StudioでJDKのパスを指定する

久しぶりにAndroid Studioでサンプルアプリを作ろうとしたら、JDK7を使えと怒られてしまいました。 設定を確認すると、JDK6を使うように設定されていました。 Project Structureはcmd + ;で開きます。 JDKは1.8をインストールしていたはず・・・と思って確認すると、やっぱり1.8がインストールされていました。 コマンドプロンプトを開いてjava -versionでインストールされているJavaのバージョンが確認できます。(正確にはJREのバージョンの確認ですけど) しかし、/System/Library/Java/JavaVirtualMachinesにはJDK6しかない。調べてみると、JDK1.7以降ではインストールされているディレクトリが異なる模様。 それぞれのJDKのディレクトリを確認するには、コマンドプロンプトで/usr/libexec/java_home -v バージョンで、JDKのバージョンごとのインストールされているディレクトリが確認できます。 とりあえずJDK7を使えというエラーメッセージだったので、JDK7のディレクトリを指定してやることでエラーメッセージが消えました。 ちなみに、JDK7はOracleのサイトからダウンロードできます。

Android Studio 0.8.12がリリースされています

Android Studio 0.8.12がCanary Channelでリリースされています。 Canary Channelでリリースといっても、今回はパッチ形式での配布ではないので通知がきていないかもしれません。今回のバージョンアップでは、新たにAndroid Studioをまるごとダウンロードする必要があります。(バグへの対応のため、パッチ形式による提供はできなかったそうです) 0.8.12での変更点 新しくなったAVDマネージャー 画面サイズが分かりやすく表示されているのがありがたいですね。見た目が今風になっているだけでなく、設定がしやすくなったように思います。 Gradle WrapperがHTTPSで通信するようになった Mavenのリポジトリ(JCenter)からライブラリを取得したりする際に、HTTPSで通信するようになったようです。セキュリティ面の強化ということなんでしょうかね。 レイアウトXMLエディターの初期画面をTEXTモードに 新しくレイアウトXMLファイルを作成した際に、エディタがグラフィカルモードではなくテキストモードで開かれるようになります。GUIでデザインなんかしないよという人にはありがたい機能かもしれません。 その他いろいろ string.xmlからTranslation Editorが開けるようになったり、新規プロジェクト作成時にプロジェクトビューがAndroid Project viewがデフォルトで選ばれるようになったり(今まではProject viewがデフォルト)しているようです。 詳細は0.8.12のリリースノートを参照してください。 以前のバージョンのAndroid Studioと共存させる方法 Macの場合の話ですが、今まで使っていたAndroid Studio.appの名前を変更するだけで、Android Studioの旧バージョンと新しいバージョンを共存させることができます。 分かりやすいようにバージョンを後ろに追記してやるのがいいと思います。名前がAndroid Studioと被らなければいいので、別にAndroid Studioあ.appとかでも問題ないです。

Android Studioでテスト用のディレクトリ名を確認する方法

テストコードを配置するディレクトリ名は、以前はinstrumentalTestという名前でした。しかし現在ではandroidTestという名前になっています。 Googleで検索すると、未だに「instrumentalTestというディレクトリを作成しよう」という情報もあるので注意が必要です。 と言っても、最近のAndroid Studioは最初からテスト用のディレクトリを用意してくれるようになったので、自分でテスト用ディレクトリを用意する必要性もなくなっています。 ちなみに自分の使っているAndroi dStudioのテスト用ディレクトリ名が何なのかは、app/app.imlを確認すればわかると思います。 <sourceFolder ... isTestSource="true" />というタグを見れば、テスト用のディレクトリがandroidTestであることが分かります。 もし古いバージョンのAndroid Studioを使っている場合は、ここを見ることでディレクトリ名として何を使えばいいのかが分かります。