2013年5月25日土曜日

[Android] OpenGLで簡易画像ビュアーを作る

How to make pictures viewer on OpenGL
OpenGL APIを使って画像ファイルを画面に表示するアプリを作ってみました。

このブログを書いている時点の開発環境は次の通りです。
・Windows8 (64bit)
・Eclipse Juno (32bit) (XP互換モードで起動)
・Android SDK r21.0.1

なぜOpenGL APIを使うのか?
Androidアプリに画像を表示するだけならImageViewを使えばもっと短いコードでアプリを作ることができます。
ですが今後、複数の画像を並べたり拡大縮小の機能を自前で追加したいと思ってます。
OpenGL APIを使うとでアプリの作り方次第で画像の移動・拡大・縮小・回転をスムーズに表示することができます
これらの理由からあえてOpenGLを使うことにしました。
(ただし今回作る機能は表示と移動のみです)

今回のアプリで表示する画像は1枚とします。
OpenGLで画像をテクスチャとして表示するためには、辺の長さが2の累乗(べき乗)の正方形の画像を用意します。
256×256ピクセル、512×512ピクセルなど。
この通りの画像で内場合端末によってはテクスチャを表示できないことがあります。

サンプルのため、256×256ピクセルのスカイツリーの画像を用意しました。


画像ファイル(image256x256.png)はプロジェクトの
res - drawable-mdpi
にコピーします。
resフォルダーの下に drawable-nodpi というフォルダーを作ってそこに画像ファイルをコピーしてさい
drawable-nodpi 以外のフォルダーに保存した画像は端末の解像度に応じて自動でスケーリングされるようです。(2014年5月31日訂正)

※ ic_launcher.png はAndroid-SDKのデフォルトでインストールされるアイコン画像です。

以下、ソースです。

Activityクラス (MainActivity.java)
※特別な権限(Permission)は不要なのでマニフェストは省略します。
Android1.6以降で動作します。
Target SDK Version が4以上の設定でビルドできます。
auのIS01(シャープ)で動作することを確認しています。

下の様に画面に画像が表示されます。

タッチイベントを使って画面のフリックでスクロールします。
スクロールはテクスチャ画像を動かすのではなく、カメラ(視点)を移動させる仕様にしています。

今後はさらに改良を加えていきたいと思います。


関連ブログ
[Windows8][Android] Can't bind to local 8600 for debugger
[Android] Javaのstaticクラスから非sataticメソッドを呼び出すには
[Android] Unity + EclipseのClassNotFoundExceptionを解決する
[Android] Unity + Eclipse の unityplayerproxyactivity.jarの欠落を解決する
[Android] 端末を充電中に画面をつけたままにするには
[Android] WebView の FATAL EXCEPTION を解決する
[Android] WebViewを使うときの注意点
[Android] アプリの履歴を調べるアプリの作り方
[Android] Android4.0をVmwareやVirtualBoxで起動する
[Android] エミュレーターの動作を少しでも速くするには
[Android] Android-SDKでやってはいけないこと
[Android] Toastに画像やボタンを表示するには
[Android] ライブ壁紙の作り方
[Android] マルチタッチアプリケーションの作り方
[Android] 新旧のAndroidで動作するServiceの作り方
[Android] 端末をPCにつないでも認識されない
[Android-NDK] ERROR [binderDied] end
[Android] 自身をタスクキルするアプリケーションを作るには
[Android] OpenGLで頂点の多いポリゴンを扱うには
[Android] OpenGLでシャープ製端末用3D(立体視)アプリケーションを作る
[Android] SoundPoolのオーディオ再生ミスをなくす
[Android] 画面の向きを設定するには
[Android] OpenGL ESで文字を表示する
[Android] Activityに時計を表示する(Activityの非同期更新)
[Android] データ通信をオンにしても3Gにつながらない
[Android] 画面の回転に反応するウィジットアプリケーションを作るには #2
[Android] Webコンテンツを強制的に表示するには
[Android] Toastをcancelするには


以上、参考になれば幸いです。

0 件のコメント:

コメントを投稿