画面の回転
Android携帯は、携帯を横にするとアプリの表示もクルッと回転しますよね。エミュレーターでもctrl+F11で回転します。
回転すると、一度アクティビティが破棄されます。破棄される前に起動しているアプリのデータを保存させる必要があります。回転させる場合はその保存方法などもおぼえる必要があります。
回転させない場合は設定があります。プロジェクトファイルの中に「AndroidManifest.xml」というファイルがあります。内容は下記の黒字のようになってますがそこに赤字のメソッドを加えます。
フィル名「AndroidManifest.xml」 <?xml version="1.0" encoding="utf-8"?> <uses-sdk android:minSdkVersion="7" /> <application <category android:name="android.intent.category.LAUNCHER" /> </manifest> |
portraitー縦向き固定 landscapeー横向き固定 unspecifiedー固定しない |
固定していまう場合はデータ保存とかはないのでこの設定をすればいいですね。
次は回転させてそのつど表示を変えるやり方です。今回紹介するやり方は、書籍にかいてある通りなのでわたしにもいまいちわかりませんが、回転機能を使うときに改めて勉強しなすことにします。一応ご紹介。
設定が変更された時に「呼び出される |
||
public void onConfigrationChanged(Configration newConfig) | ||
このメソッドは、アクティビティの設定が変更されたときに自動的に呼び出されるメソッドです。 | ||
引数には、アクティビティの設定を管理するConfigrationというクラスのインスタンスが渡されます。 |
||
インスタンスの状態を保存する |
||
protected void onStateInstanceState(Bundle savedInstanceState) | ||
アクティビティが破棄されるときにフィールド値を初期状態にしてしまいます。そこで破棄する前にインスタンスの状態を保管 | ||
するためのメソッドを用意し、これを呼び出すようになっています。それが | ||
onSavedInstanceState メソッドです。引数には Bundle というクラスのインスタンスが渡されます。 | ||
これを使って、さまざまな値を一時保存できるようになっています。 | ||
インスタンスの状態を再現する |
||
protected void onRestoreInstanceState(Bundle outState) | ||
新たにアクティビティのインスタンスを作成して画面に表示する際に呼び出されるメソッドです。 | ||
保管してあったメソッドの状態を、これから使うインスタンスに設定するためのものです。 | ||
引数に渡される「Bandle」から、一時保存してあった値を撮り出し、新しいプロパティに設定してやることで、前のインスタンスの状態を再現することができます。 | ||
ということで、縦の時は縦長に、横の時は横長に画像を表示するプログラムを書きます。 | ||
ファイル名「ViewActivity.java」 package and.roid; import android.app.Activity; public class ViewActivity extends Activity { Resources resources = getResources(); setContentView(R.layout.main); public void onConfigurationChanged(Configuration newConfig){ protected void onSaveInstanceState(Bundle savedInstanceState){ protected void onRestoreInstanceState(Bundle outState){ public Rect getArea(){ |
||
わたしはイマイチわからないのですが、このやり方は「普通こんなやり方ではやらない」やり方らしいです。ただ今回のメソッドの使い方などをわかりやすく使用するためのサンプルらしいです。 | ||
ファイル名「MyView」 package and.roid; import android.content.Context; public class MyView extends View { public MyView(Context context) { public MyView(Context context,AttributeSet attrs){ Resources resources = context.getResources(); protected void onDraw(Canvas c){ int w = this.getWidth(); } |
||
こちらも微妙に変更してありますね。実行すると | ||
こうなりました。とりあえずわたしは固定に頼ることにして、回転機能を使うときにまたおぼえることにします・・・ |
タッチのイベント |
||
たっちゃん・・とか幽体離脱とかじゃないですよ。スマホといえばやはりタッチパネルです。そのタッチイベントの処理を書いていきます。 | ||
前回のソースコードをちょちょっと改造すればいいみたいなので、ちゃちゃっとやってみます。 | ||
ファイル名「MyView.java」 package and.roid; import android.content.Context; public class MyView extends View { public MyView(Context context) { public MyView(Context context,AttributeSet attrs){ Resources resources = context.getResources(); protected void onDraw(Canvas c){ int w = this.getWidth(); public boolean onTouchEvent(MotionEvent event){ } |
||
ちょっと解説です。 | ||
onTouchEvent(MotionEvent event)がイベントを処理するコードです。event.で色々取り出したりするわけですね。 | ||
int x = (int)event.getX(); | ||
int y = (int)event.getY(); | ||
でタッチした座標X、Yを取り出しています。 | ||
そしてその座標を中心として200×200の画像を再描画していますね。 | ||
invalidate(); | ||
で画面を更新させるみたいですよ。 | ||
上記はタッチした場所の座標を認識して表示させていて、画像そのものをタッチしているわけはありません。 | ||
しかしViewにはButtonなどは組み込めません。なので自分で作っていくことになります。そしてその「どのエリアをタップした」と | ||
いう処理をします。 | ||
ファイル名「MyView.java」 package and.roid; import android.content.Context; public class MyView extends View { public MyView(Context context) { public MyView(Context context,AttributeSet attrs){ Resources resources = context.getResources(); protected void onDraw(Canvas c){ int w = this.getWidth(); public boolean onTouchEvent(MotionEvent event){ invalidate(); private void showMsg(){ } |
||
このプログラムは表示させた画像をボタンとしてみたてて、その領域をタップするとタップしたっぽく色が薄くなるプログラムです。 | ||
だんだんとややこしくなってきました。ちょっとだけ説明です。 | ||
int action = event.getAction(); int x = (int)event.getX(); int y = (int)event.getY(); |
||
event.getAction();はイベントのアクションというものを取り出すものです。 | ||
if(x>rect.left && x<rect.right && y>rect.top && y<rect.bottom) | ||
オブジェクトrectの座標範囲内にタッチしてるかどうかの判定です。 | ||
switch(action) | ||
でactionの種類によって処理をしてます。 | ||
ACTION_DOWNは「画面に触れたイベント」 | ||
ACTION_UPは「画面から離したイベント」 | ||
invalidate();で画面を更新しています。なにか描画更新したときにはこのメソッドで更新し、なにもしないときはメソッドを呼び出さないようにしています。 | ||
ということで、今回はここまでです。
次からは今まで覚えたものでなんとかアプリを作ってみようと思います。