#はじめに
OpenGL ES の GLSurfaceView を使ってアンドロイドアプリを作成するとき、ビューポート領域と画面サイズを合わせるための方法を紹介します。
#GLSurfaceView.Rendererの設定
__GLSurfaceView.Renderer__インターフェースを実装するクラス内で設定をします。
ビューポートの設定と座標系の設定は、 __onSurfaceChanged__メソッド内で行います。
__onSurfaceChanged__メソッドは、画面の縦向きと横向きが変更されるときに呼ばれるため、縦向きと横向きの両方に対応するアプリを作成することも可能です。
ここで、__SCREEN_WIDTH__と __SCREEN_HEIGHT__は作成するアプリの解像度とします。
public class GLRenderer implements GLSurfaceView.Renderer {
//
// その他のフィールド・メソッドなど
//
@Override
public void onSurfaceChanged(GL10 gl10, int w, int h) {
// ビューポートの設定
double scaleX = (double)w / SCREEN_WIDTH;
double scaleY = (double)h / SCREEN_HEIGHT;
double scale = scaleX > scaleY ? scaleY : scaleX;
int dpW = (int)(scale * SCREEN_WIDTH);
int dpH = (int)(scale * SCREEN_HEIGHT);
int offsetX = (w - dpW) / 2;
int offsetY = (h - dpH) / 2;
gl10.glViewport(offsetX, offsetY, dpW, dpH);
// 投影変換行列の設定
gl10.glMatrixMode(GL10.GL_PROJECTION);
gl10.glLoadIdentity();
// 幅、高さを設定
// ビューポート領域内の座標系を左上(0, 0)、右下(SCREEN_WIDTH, SCREEN_HEIGH)に設定
// 3Dを描画するときはZ方向の描画距離を変更する
gl10.glOrthof(0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, -1.0f, 1.0f);
// タッチスクリーンの領域設定
// 今回は使用しない
// TouchManager.setScreenArea(offsetX, h - dpH - offsetY, dpW, dpH);
}
}
#イメージ図
__glOrthof__メソッドで指定した領域 (SCREEN_WIDTH, SCREEN_HEIGHT) がビューポート内に描画されます。
ビューポートのY方向のオフセットは描画可能な領域の下部からの距離となります。
#おわりに
描画と同様に、画面タッチの座標も変換しなければいけません。
次回は、タッチ座標の変換について記述したクラスを紹介します。
#参考
http://tatoapps.wordpress.com/2013/08/17/SurfaceViewとCanvasで画面サイズに合わせて描画する方法-android/