リソースを読み込むには(AndroidMode編)

◆PROCESSING 逆引きリファレンス

 カテゴリー:スマホ(AndroidMode)

リソースを読み込むには(AndroidMode編)

【概要】

PROCESSINGにAndroidMode を導入する事で、PROCESSINGで開発したプログラムをAndroid端末上で動かす事ができるようになります。

AndroidModeの導入については「PROCESSINGをAndroid端末で動かすには(4.0版)」記事を参照してください。

アプリケーションの動作に必要なデータを格納しておく場所には、ストレージ領域とプログラム領域があります。

ストレージ領域は、いわゆるDISK装置の事ですね。スマホなら大抵の場合はNAND型のメモリドライブになります。

アプリケーションの動作に必要なデータが、プログラムの制作段階で準備できるようなものなら、該当データをあらかじめプログラム領域に格納しておき、それをプログラム実行時に読み出して利用するのが一般的です。

そのようなデータとしては、ゲームのキャラクター画像や、パラメータ情報、定型的に表示する文章や音楽データなどが該当するのではないでしょうか?。

もちろんこれらの情報をストレージ領域から読み込むことも可能ですが、ここではプログラムの内部領域(リソースエリア)から取得する方法について紹介したいと思います。

同じプログラムの内部領域であるアセットエリアから取得する方法については、「アセットを読み込むには(AndroidMode編)」記事を参照してください。

リソースエリアやアセットエリアは、ストレージ領域とは異なる考え方でアクセスを行います。

リソースエリアとアセットエリアは、AndroidStudioで以下の場所にあります。

 

【詳細】

リソースエリアから読み込む

プログラムの内部領域にはリソースエリアとアセットエリアがありますが、Androidのプログラムで「より一般的」なのは、リソースエリアでしょう。

Androidの標準的なプログラムであれば、Rクラスを介してリソースエリアから様々な情報を読み込むことができます。

ですがPROCESSINGを標準エディタから利用している人は、リソースエリアから何かを読み取るのは難しいかもしれません。

なぜなら、そもそも標準エディタの機能だけでは、リソースエリアに予めファイルなどの情報を格納しておくことができないからです。

また標準エディタでは、Androidでリソースを扱う際に利用するRクラスも使うことができません。

ですのでリソースエリアから何かを読み取りたい人は、必然的にAndroidStudioなどを使って開発をする事になります。

リソースエリアに格納された情報は、Activityがもつ getResources()メソッドでResourcesオブジェクトを取得して、Resourcesオブジェクト経由で読み込むのが一般的です。
.

リソースを取得するResources res = act . getResources ();

act : Activityインスタンス
res : Resourcesインスタンス

リソース情報にアクセスするためには、まずResourcesクラスのインスタンスを取得します。

Resourcesクラスには、リソースエリアに格納された xml ファイルから、予め設定しておいた文字列や数値を読み取る便利な命令があります。

 

文字列リソースを取得する

リソースエリアの values フォルダには、はじめから colors.xml、strings.xml、styles.xml の3つのファイルが用意されています。


このうち strings.xml は、一般的に文字列を格納しておく目的で利用されます。strings.xml には、デフォルトで以下のような内容が記述がされています。

app_name と名前がつけられた行は、最初からある行です。sample と書かれた場所は、あなたのアプリケーション名ですので、本例とは異なる場合があります。

あらかじめリソース情報として文字列データを格納しておくためには、これを以下のように変更します。

上記例では、最初からある行の下に fighter_name という名前の行を追記して、「小次郎」という文字列を格納しました。

この fighter_name と名前がつけられた行に格納されている値(本例では「小次郎」)をプログラムから読み出すには、Resourcesクラスが持つ getString() メソッドを利用します。
.

文字列リソースを取得するString getStr = res . getString (int rid);

res : リソースインスタンス
rid : リソースID
getStr : 取得した文字列

rid には、Rクラス経由で得られるリソースIDを指定します。

例えば上記のような感じです。これで name には「小次郎」が格納されます。

 

数値リソースを取得する

リソース情報として格納しておけるものは、文字列だけではありません。

今度は values フォルダの中に、values.xml という名前のファイルを作成して、あらかじめ整数値を格納しておき、それをプログラムから取得してみましょう。

実は整数を格納するために、新しいリソースファイルを作成する必要はないんです。やろうと思えば、最初からある strings.xml などに、整数として取得したい値を格納しておく事も可能です。

が・・・ファイル名が strings なのに、数値が格納されているのは違和感がありますよね。そこでわかりやすいように、「整数のリソースを格納する専用のファイル」を作る事にします。

新たにリソースファイルを作成するには、values フォルダで右クリックをして表示されるメニューから

新規→XML→値XMLファイル

と選択して New Android Component ダイアログBOXを開きます。

そしてダイアログBOXの Values File Name に好きなファイル名を記述して、完了ボタンを押します。

上記では新しいリソースファイルとして、整数を格納する目的で利用する「values.xml」ファイルを作成しました。

初期状態では以下のような中身になっている筈です。

ここに整数型のリソースを追記してみます。

上記例では、fighter_hp という名前の行を追記しました。

この fighter_hp と名前がつけられた行に格納されている値(本例では「120」)をプログラムから読み出すには、Resourcesクラスが持つ getInteger() メソッドを利用します。
.

整数を取得するint getVal = res . getInteger(int rid);

res : リソースインスタンス
rid : リソースID
getVal : 取得した整数値

例えば上記のような感じです。これで hp には「120」が格納されます。

 

文字列配列を取得する

リソースファイルには、複数の値を同じ名前で格納しておき、配列変数として取り出す事も可能です。

今度は、strings.xml を以下のように記述してみましょう。

念の為、先頭行に文字コードの指定を追記しています。

そして、元々あった app_name の下に、party_member という名前で、なにやら強そうな人たち(笑)の名前を並べました。

この party_member と名前がつけられた複数の値を読み出すには、Resourcesクラスが持つ getStringArray() メソッドを利用します。
.

整数を取得するString[] getStrs = res . getStringArray(int rid);

res : リソースインスタンス
rid : リソースID
getStrs : 取得した文字列配列

こんな感じです。

これで menbers[0] には 小次郎、menbers[1] には武蔵・・・という感じで、順番に文字列が格納されます。

 

画像を取得する

それでは画像ファイルをリソースデータとして格納しておき、それをプログラムから読み取るには、どうすれば良いでしょうか?。

画像や音楽などの任意のファイルは、res フォルダの raw フォルダ配下に格納するのが一般的です。


上記例では、raw フォルダに fighter.png という名前の画像ファイルを格納しています。

この raw フォルダに格納されたファイルへアクセスするには、 Resources クラスが提供する openRawResource() メソッドを使ってファイルをOPENし、InputStream 記述子を得ます。
.

InputStreamを取得するInputStream is = res . openRawResource(int rid);

res : リソースインスタンス
rid : リソースID
is: ファイルへアクセスするための InputStream

こんな感じです。

あとはこの InputStream を使って、OPENしたファイルを好きなように加工します。

対象となるファイルが音楽や画像データであれば、もっと簡単に、画像や音楽を扱うクラスに直接リソースIDを指定して、データを読み込ませる事も可能です。

上記は、Rクラス経由で raw フォルダに格納された fighter.png ファイルを Bitmap オブジェクトに読み取る例です。

 

【関連記事】

 


サンプルプログラム

数値配列を読み取る例:

詳細のところでは文字列配列を読み取る例を紹介しましたが、このサンプルは整数配列を読み取る例となっいています。

res フォルダの values フォルダ配下に values.xml ファイルを作成し、その中身に以下が記述してある前提となります。

<出力サンプル>

 

画像を読み取る例1:

res フォルダの raw フォルダ配下に格納されている fighter.png という名前の画像ファイルを読み取り、ストレージの内部領域に複写します。

注意としては、上記サンプルをAndroid6.0以降で試す場合は、自アプリケーション領域へのCOPYでしか、正しく動作しないという事です。

Android6.0以降で自アプリケーションの領域外にCOPYする場合は、特別な処理を加える必要があります。詳しくは「SDカードをアクセスするには(AndroidMode編)」を参照してください。

<出力サンプル>
複写前の内部領域

複写後の内部領域

 

画像を読み取る例2:

res フォルダの raw フォルダ配下に格納されている fighter.png という名前の画像ファイルを読み取り、画面に表示します。

PROCESSINGは AndroidのBitmapクラスに格納した画像を直接表示できないので、PROCESSING専用の PImage クラスに変換して表示しています。

<出力サンプル>

(画像URL:illust-AC 様:Kamesan さん)

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。