◆PROCESSING 逆引きリファレンス
カテゴリー:スマホ(AndroidMode)
画面サイズを取得するには(AndroidMode編)
【概要】
PROCESSINGにAndroidMode を導入する事で、PROCESSINGで開発したプログラムをAndroid端末上で動かす事ができるようになります。
AndroidModeの導入については「PROCESSINGをAndroid端末で動かすには(4.0版)」記事を参照してください。
自分の端末の画面サイズを得るには、PROCESSINGの命令を使う方法と、Androidの命令を使う方法があります。
Androidの画面は、以下のようになっていますが、どのサイズが取得できるかは、利用する命令によって異なります。
名称 | 説明 |
---|---|
Status Bar | 画面上部にある表示エリア |
Navigation Bar | 画面下部にある表示エリア。機種によりソフトウェアボタンの場合とHWボタンの場合がある |
Real Size | Status Bar、Navigation Bar を含む全画面サイズ |
Display Size | Navigation Bar を除く画面サイズ |
以下はAndroidModeで画面サイズを取得する代表的な方法です。
PROCESSINGの命令
- グローバル変数を使う
- PAppletのメソッドを利用する
- PSurfeceから取得する
Androidの命令
- Display クラスを利用する
- DisplayMetrics クラスを利用する
なおこの先の説明は、フルスクリーン状態を前提としたものとなっています。size() 命令を使う場合は、得られる値が異なるものになるため、以下の説明は適切ではありません。
画面サイズを得る方法がたくさんあるので、どれを使おうか迷う所ですが、仮に setup() 関数の中から使うのであれば
目的 | 利用する命令 |
---|---|
Real Size がほしい | PROCESSINGのグローバル変数を使う。 |
Display Sizeがほしい | AndroidのDisplayクラスを利用する。 |
Status Bar の大きさが知りたい | PROCESSINGのPSurfeceを利用する。 |
Navigation Bar の大きさが知りたい | AndroidのDisplayクラスを利用する。 |
settings()関数の中で使いたい | PROCESSINGのグローバル変数(displayWidth、displayHeight)を使うか、AndroidのDisplayMetrics クラスを、Resources経由で取得して利用する。 |
のが良いのではないかと思います。
【詳細】
PROCESSINGの命令で取得する
int height ;
int displayWidth ;
int displayHeight;
settings() 関数の中で利用した場合、displayWidth と displayHeight は Display Size を返却します。
widthとheightは setup() 関数の中か、それ以降の処理の中で利用してください。settings() 関数の中で利用すると -1 が戻るので、注意が必要です。
setup() 関数以降で利用した場合、全ての変数は Real Size を返却します。
displayWidth と displayHeight は、Navigation Bar をソフトウェアで表示している端末の場合、使う場所により返却する値が異なるので注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 1080 × 1920 の端末の例(Navigation Barがオンスクリーン) @Override public void settings() { fullScreen(); //width = -1 height = -1 //displayWidth = 1080 displayHeight = 1776 } @Override public void setup() { //width = 1080 height = 1920 //displayWidth = 1080 displayHeight = 1920 } @Override public void draw() { background(200); //width = 1080 height = 1920 //displayWidth = 1080 displayHeight = 1920 } |
int ht = sketchHeight ( ) ;
wd : 画面の幅
ht : 画面の高さ
この命令は、Real Size を返却します。
この命令は setup() 関数の中か、それ以降の処理の中で利用してください。settings() 関数の中で利用すると -1 が戻るので、注意が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 1080 × 1920 の端末の例(Navigation Barがオンスクリーン) @Override public void settings() { fullScreen(); //sketchWidth = -1 sketchHeight = -1 } @Override public void setup() { //sketchWidth = 1080 sketchHeight = 1920 } @Override public void draw() { background(200); //sketchWidth = 1080 sketchHeight = 1920 } |
int wd = v . getWidth( ) ;
int ht = v . getHeight( ) ;
int wd = r . width( ) ;
int ht = r . height( ) ;
r : PSurface の表示フレーム領域情報
wd : 画面の幅
ht : 画面の高さ
getSurface() は setup() 関数の中か、それ以降の処理の中で利用してください。settings() 関数の中で利用すると 例外エラーとなるので、注意が必要です。
getRootView() で得られる View からは、Real Size が得られます。
getVisibleFrame() を setup() 関数で利用した場合、Real Size からStatus Barを除いたサイズが得られます(つまり、Status Bar のサイズがわかります!)。
またgetVisibleFrame() を draw() 関数以降で利用した場合は Real Size が戻ってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 1080 × 1920 の端末の例(Navigation Barがオンスクリーン) @Override public void settings() { fullScreen(); //getRootView getSurface() できないので 例外エラー //getVisibleFrame getSurface() できないので 例外エラー } @Override public void setup() { //getRootView Width = 1080 Height = 1920 //getVisibleFrame Width = 1080 Height = 1848 } @Override public void draw() { background(200); //getRootView Width = 1080 Height = 1920 //getVisibleFrame Width = 1080 Height = 1920 } |
Androidの命令で取得する
Display display = wmng . getDefaultDisplay ( ) ;
void display . getSize ( Point size ) ;
void display . getRealSize( Point size );
act : Activity クラスのインスタンス変数
wmng : WindowManager クラスのインスタンス変数
display : Displayクラスのインスタンス変数
size : Pointクラスのインスタンス変数
getSize() は Display Size を戻します。また getRealSize() は Real Size を戻します。
Display クラスのインスタンスを得る getWindowManager 命令は Activity クラスのメソッドですので、これらの命令は settings() 関数の中では利用できません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 1080 × 1920 の端末の例(Navigation Barがオンスクリーン) @Override public void settings() { fullScreen(); //getSize getActivity() できないので 例外エラー //getRealSize getActivity() できないので 例外エラー } @Override public void setup() { //getSize Width = 1080 Height = 1776 //getRealSize Width = 1080 Height = 1920 } @Override public void draw() { background(200); //getSize Width = 1080 Height = 1776 //getRealSize Width = 1080 Height = 1920 } |
Display display = wmng . getDefaultDisplay ( ) ;
void display . getMetrics( DisplayMetrics dm);
int wd = dm . widthPixels ;
int ht = dm . heightPixels ;
DisplayMetrics dm = res . getDisplayMetrics () ;
int wd = dm . widthPixels ;
int ht = dm . heightPixels ;
act : Activity クラスのインスタンス変数
wmng : WindowManager クラスのインスタンス変数
res : Resources クラスのインスタンス変数
dm : DisplayMetrics クラスのインスタンス変数
wd : 画面の幅
ht : 画面の高さ
DisplayMetrics からは 、DIsplay Size が得られます。
Activity クラスの getWindowManager 経由でDisplayMetricsを得る方法は、settings() 関数の中では利用できません。
settings() 関数の中でサイズを取得したい場合は、Resourcesクラスの getSystem 経由で得られる DisplayMetrics を利用してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 1080 × 1920 の端末の例(Navigation Barがオンスクリーン) @Override public void settings() { fullScreen(); //Display getMetrics getActivity() できないので 例外エラー //Resources getDisplayMetrics Width = 1080 Height = 1776 } @Override public void setup() { //Display getMetrics Width = 1080 Height = 1776 //Resources getDisplayMetrics Width = 1080 Height = 1776 } @Override public void draw() { background(200); //Display getMetrics Width = 1080 Height = 1776 //Resources getDisplayMetrics Width = 1080 Height = 1776 } |
その他
Androidの命令について詳しく知りたい方は、下記公式サイトも参照してください。
【関連記事】
サンプルプログラム
PROCESSINGの命令で取得する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
import android.view.View; import android.graphics.Rect; final int FONT_SIZE = 16; //文字の大きさ PFont font; //文字 ArrayList<PVector> point; //サイズ格納用 ArrayList<String> comment; //コメント /** * Android Mode 画面サイズ表示サンプル * @author MSLABO * @version 1.0 */ void setup(){ fullScreen(); //表示用文字を読み込む font = createFont( "ipag.ttf", FONT_SIZE ); textSize( FONT_SIZE ); textFont( font ); textAlign( LEFT, TOP ); point = new ArrayList<PVector>(); comment = new ArrayList<String>(); getProcessingDisplaySize(); } void draw(){ background( 200 ); int iRow = 0; for( int i = 0; i < point.size(); i++ ){ PVector p = point.get(i); String msg = comment.get(i); text( "(" + i + "):" + msg + (int)p.x + "," + (int)p.y, 0, iRow ); iRow = iRow + FONT_SIZE; } } //PROCESSINGの命令で画面サイズを表示する void getProcessingDisplaySize(){ PVector p; String msg; point.clear(); comment.clear(); fill(0); // ----------------------- // グローバル変数から得る // ----------------------- p = new PVector( width, height ); point.add( p ); msg = "width/height="; comment.add( msg ); p = new PVector( displayWidth, displayHeight ); point.add( p ); msg = "displayWidth/displayHeight="; comment.add( msg ); p = new PVector( sketchWidth(), sketchHeight() ); point.add( p ); msg = "sketchWidth/sketchHeight="; comment.add( msg ); // ----------------------- // PSurface から得る // ----------------------- View v = getSurface().getRootView(); p = new PVector( v.getWidth(), v.getHeight()); point.add( p ); msg = "RootView Width/Height="; comment.add( msg ); Rect r = getSurface().getVisibleFrame(); p = new PVector( r.width(), r.height()); point.add( p ); msg = "VisibleFrame Width/Height="; comment.add( msg ); } |
PROCESSINGがもつグローバル変数とPSurfaceクラスから、画面サイズを取得して表示しています。
Androidの命令で取得する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
import android.view.View; import android.app.Activity; import android.graphics.Rect; import android.graphics.Point; import android.view.WindowManager; import android.view.Display; import android.util.DisplayMetrics; import android.content.res.Resources; final int FONT_SIZE = 16; //文字の大きさ PFont font; //文字 ArrayList<PVector> point; //サイズ格納用 ArrayList<String> comment; //コメント Activity act; /** * Android Mode 画面サイズ表示サンプル * @author MSLABO * @version 1.2 */ void setup(){ fullScreen(); act = getActivity(); //表示用文字を読み込む font = createFont( "ipag.ttf", FONT_SIZE ); textSize( FONT_SIZE ); textFont( font ); textAlign( LEFT, TOP ); point = new ArrayList<PVector>(); comment = new ArrayList<String>(); //Androidの命令でサイズを取得する getSdkDisplaySize(); } void draw(){ background( 200 ); int iRow = 0; for( int i = 0; i < point.size(); i++ ){ PVector p = point.get(i); String msg = comment.get(i); text( "(" + i + "):" + msg + (int)p.x + "," + (int)p.y, 0, iRow ); iRow = iRow + FONT_SIZE; } } //Androidの命令でサイズを取得する void getSdkDisplaySize(){ PVector p; Point getPoint = new Point(); String msg; point.clear(); comment.clear(); fill(0); //Display クラスからサイズを得る WindowManager wmng = act.getWindowManager ( ) ; Display display = wmng.getDefaultDisplay ( ) ; display.getSize ( getPoint ) ; p = new PVector( getPoint.x, getPoint.y ); point.add( p ); msg = "Display Width/Height="; comment.add( msg ); //Display クラスからRealSizeを得る display.getRealSize ( getPoint ); ; p = new PVector( getPoint.x, getPoint.y ); point.add( p ); msg = "RealSize Width/Height="; comment.add( msg ); //DisplayクラスのDisplayMetricsから得る DisplayMetrics dm = new DisplayMetrics(); display.getMetrics( dm ); p = new PVector( dm.widthPixels, dm.heightPixels ); point.add( p ); msg = "DM Width/Height="; comment.add( msg ); //ResourceクラスのDisplayMetricsから得る Resources res = Resources.getSystem () ; DisplayMetrics dm2 = res.getDisplayMetrics () ; p = new PVector( dm2.widthPixels, dm2.heightPixels ); point.add( p ); msg = "Resources DM Width/Height="; comment.add( msg ); } |
Androidの命令を利用して画面サイズを得ています。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。