Androidアプリケーション技術者認定試験ベーシックの試験範囲の知識をまとめた(4)

# ユーザーインターフェース２

## ダイアログ

### ダイアログの表示

ポップアップダイアログを表示するには以下の方法がある

1. AlertDialogクラスを利用する方法
1. Dialogクラスのサブクラスを利用する方法
1. アクティビティをダイアログテーマで使用する方法

ActivityクラスのshowDialog(int id)メソッドを使ってダイアログを表示できる。初回はonCreateDialogメソッドが呼び出されて、そこでダイアログを作る。表示されるたびにonPrepareDialogメソッドが呼び出されるので、表示を制御する場合はここで行う。

ダイアログを閉じるにはActivityクラスのdismissDialogメソッドを使う。指定したIDのダイアログを閉じられる。
または、Dialogクラスのdismissメソッドを用いる。自分自身を閉じる。

#### AlertDialogクラスを使う

標準的なダイアログ表示可能なクラス。AlertDialog.Builderクラスを使って組み立てる

#### ダイアログのボタン処理

AlertDialogの場合は、標準でボタンは最大3つまで表示できる。
PositiveButton, NeutralButton, NegativeButtonの3種類。

押下イベントを受け取るためには、DialogクラスのOnClickListenerインターフェースを実装する
ダイアログのクリックリスナーに登録し、コールバックメソッドが呼び出されるようにする。

##### Android3.0以降のダイアログ表示

showDialog, onCreateDialog(int), onCreateDialog(int, Bundle)は既に**非推奨API**となっている。

#### ダイアログにリストを表示する

AlertDialogクラスのsetSingleChoiceItemsメソッドや、setMultiChoiceItemsを利用することでリストを簡単に表示できる。

#### カスタムレイアウト

カスタムダイアログを使って、自由にデザインできる。
AlertDialogにカスタムレイアウトを使用することもできる。
LayoutInflaterクラスのinflateメソッドで、カスタムレイアウトからViewオブジェクトを作成する
その後、AlertDialog.BuilderクラスのsetViewメソッドでそのViewオブジェクトを指定する

#### プログレスダイアログ

- プログレスダイアログ バックグラウンド処理の進捗を表示するダイアログ。バースタイルと、スピナースタイルがある。

プログレスダイアログの表示にはProgressDialogクラスを使用する。
バータイプで進捗を表すにはProgressDialogクラスのsetProgressStyleの引数にSTYLE_HORIZONTALを指定する。
最大値はsetMax,進捗を変更するにはsetProgress, incrementProgressByを使用。

AsyncTaskでバックグラウンド処理を行う場合、publishProgressを呼び出すと、onProgressUpdateが呼び出されるようになるのでここでプログレスダイアログの割合を更新する。

## ノーティフィケーション

通知をする方法には2種類ある

- トーストメッセージ ダイアログより簡単なもの
- ステータスバー ステータスバーに表示するもの

### トーストメッセージ

一定時間メッセージを表示する機能。ボタンを必要としないメッセージなどに使用。
時間の指定にはToast.LENGTH_SHORTとToast.LENGTH_LONGがある。

#### トーストの表示位置

デフォルトでは画面中央少し下に表示される。変えるにはToastクラスのsetGravityメソッドを利用する。

#### レイアウトのカスタマイズ

トーストもカスタマイズ可能。画像表示などもできる。
XMLで定義した場合レイアウトインフレータでビューオブジェクトを作成し、ToastクラスのsetViewメソッドでセットする。トーストメッセージは通常は、makeTextで指定するが、カスタムレイアウトの場合はToastクラスのインスタンスを作成し、setDurationやsetViewを使用して設定する。

#### ノーティフィケーション(通知)

ステータスバーに通知を表示する仕組み

ノーティフィケーションを使用するには、ContextクラスのgetSystemServiceメソッドを使って、NotificationManagerの参照を取得する必要がある。

```Java
    NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
```

次に、ノーティフィケーションクラスのオブジェクトをインスタンス化する

```Java
    Notification notification = new Notification(icon, text, when);
```

- icon 通知アイコン
- text メッセージテキスト
- when 通知を出すタイミング

次に、展開メッセージ画面に表示するメッセージと通知がタップされた場合に投げるインテントを定義する

最後に、NotificationManagerクラスのnotifyメソッドでNotificationオブジェクトを登録する

##### Android3.0以降でのノーティフィケーション

**Notification.Builder**を使うことが推奨されている。

### ノーティフィケーションの振る舞い

通知が発行された後のメッセージの動作を指定できる

例：

|||
|---|---|
|FLAG_AUTO_CANCEL|通知ウインドウから選択された後、通知を自動的にキャンセル（消去）する|
|FLAG_INSISTENT|ユーザが応答するまでサウンドを繰り返し再生する|
|FLAG_ONGOING|”実行中”グループに通知を設定する。バックグラウンドで実行中であることを示す|
|FLAG_NO_CLEAR|「通知を削除」ボタンで通知を削除できなくする。削除するにはプログラム内から削除処理をする必要がある|

### ノーティフィケーションに付加する要素

- フラッシュライトの点滅
- バイブレータによる振動
- サウンドの再生

以上が通知に設定できる

## スタイルとテーマ

### スタイル

ビューのプロパティのセットをまとめて定義しておける機能

スタイルの定義ファイルはres/valuesフォルダ下に配置。そして、作成したスタイルのname属性で指定したスタイル名をビューのstyle属性に記述する。

#### スタイルの継承

styleの定義はparent属性を使用して親のスタイルを指定し、カスタマイズ可能

### テーマ

定義したスタイルをアプリケーション内すべてのビューやアクティビティ単位で設定するためのもの。
定義の方法はスタイルと同様。
例えばアプリケーションに指定する場合は、`<application>`タグのthemeで指定する。
アクティビティにテーマを適用する場合は、`<activity>`タグのthemeで指定する
コードで指定する場合はsetThemeメソッドを使用する。

### 既定のテーマ

例：

|||
|---|---|
|Theme.Black|黒色背景|
|Theme.Light|白色背景|
|Theme.NotitleBar|タイトルバー無し|
|Theme.NoTitleBar.Fullscreen|ステータスバーも含まない、フルスクリーン|
|Theme.Dialog|ダイアログ風|
|Theme.Trancelucent|背景が透過|

#### Android3.0以降に追加されたテーマ

- Theme.Holo
- Theme.Holo.NotitleBar
- Theme.Holo.NoTitleBar.Fullscreen
- Theme.Holo.Dialog
- Theme.Holo.Light

## グラフィックス

- 2DグラフィックスAPI
- OpenGL Android2.2以降はOpenGL ES 2.0（今はたぶんES3.0）

### ビューアニメーション

- Tweenアニメーション ビューを変化させるアニメーション、移動、回転、透明度（アルファ）、拡大縮小（スケール）がある
- フレームアニメーション いわゆる「パラパラ漫画」指定した間隔で画像を切り替えることで動画を表現する

#### Tweenアニメーション

- アニメーションクラスのオブジェクトを作成する。

|||
|---|---|
|TranslateAnimation|移動アニメーションを行うクラス|
|RotateAnimation|回転を行うクラス|
|ScaleAnimation|拡大縮小を行うクラス|
|AlphaAnimation|透明度（アルファ）を行うクラス|
|AnimationSet|複数のアニメーションをまとめて行うためのクラス|

- アニメーションの保管方法やディレイタイム（開始遅延時間）を指定する。

ディレイタイムの設定は、AnimationクラスのsetStartOffsetメソッドを使用する。
補間方法の設定は、AnimationクラスのsetIterpolatorメソッドを使用する。

- ビューにアニメーションを適用し、開始する。

セットには、ViewクラスのsetAnimationメソッドを使用する。
開始は、Animationクラスのstartメソッドか、ViewクラスのstartAnimationメソッドでも可能。

#### アニメーションリソースファイル

アニメーションリソースファイルをXMLで作っておくことも可能
res/anim配下に置くこと。
リソースファイルを適用するときには、AnimationUtilクラスのloadAnimationメソッドを使用する

##### アニメーションの補間方法

アニメーションの保管方法には補間クラスが既に用意されている。

### フレームアニメーション

フレームアニメーション用のリソースファイルも、res/animフォルダに作成する。
コードで利用する場合、ビューの背景にリソースを指定する。(setBackgroundResourceメソッド)
開始するにはAnimationDrawableクラスのstartメソッドを使用する
AnimationDrawableオブジェクトは、リソースを背景に設定した後で、ViewクラスのgetBackgroundメソッドで取得できる

- 注意

onCreateメソッドではAnimationDrawableクラスのstartメソッドは呼び出せない
例えば、onWindowFocusChanged等で実施する。

### Canvasクラス

図形や文字を描画するのに便利なクラス。
ビューに直接2Dを描画するにはViewクラスのサブクラスを作成し、onDrawメソッドをオーバーライドする。
引数で渡されてきたCanvasオブジェクトに対して、様々な描画処理を実施する。
Paintクラスは描画のための様々な設定を保持するクラス

### 2D図形の描画

Canvasクラスの描画メソッドで図形を描画することが出来る。
円弧、画像、円、線分、点、文字、矩形、角の丸い矩形などがある

#### 座標の単位について

これらのメソッドの座標指定単位はピクセルであるため、解像度と画面サイズの違いには注意が必要。
元となるサイズを決めて、実際の端末の画面サイズとの比率で計算するような処理も必要となる。

### 画像の描画

画像は以下のフォルダに格納する

|||
|---|---|
|res/drawable-ldpi|低解像度(120dp)用|
|res/drawable-mdpi|中解像度(240dp)-デフォルト|
|res/drawable-hdpi|高解像度(360dp)用|
|res/drawable-xhdpi|高解像度(480dp)用|

#### 解像度に合わせた画像の自動リサイズについて

すべて用意しなくても、アンドロイドが自動でサイズ変換を行ってくれる。
自動サイズ変換は便利だがその分メモリーを消費する
無効にするにはres/drawable-nodpiに画像フォルダを表示する

通常、ImageViewクラスで画像ファイルを指定するか、Viewクラスの背景に指定すること（setBackgroundResource)で画像が描画される。

画像リソースのBitmapオブジェクトを指定することも可能。BitmapFactoryクラスのメソッドを利用する。
Bitmapの情報を利用して、CanvasクラスのdrawBitmapで描画できる
SDカードのBitmapを取得する場合はdecodeFileメソッドを利用することが可能