スマホアプリで見栄えをぐっと良くする小技いろいろ(Xamarin.Forms版)

##はじめに
Qiitaの最新投稿を一覧表示するアプリケーションを題材にプログラマ自身で出来る様々な小技を説明してみたいと思います。
まずは、Xamarin.Formsを使ったiPhoneアプリを題材にして進めてみます。
この記事用にスクリーンショットをとった開設用アプリは今回フルスクラッチで書きました。
最後にGitHubのURLを記述するので、興味があればご覧ください。

ステップバイステップでコミットしてあるので、変更点と結果（見た目への影響）が比較的わかりやすいと思います。(Xamarin.Formsですが)

##これがこうなる
|これ<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/eed426d0-489b-601e-ff20-1e3e306d0749.png" width="300">|こう<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/fca8b1ab-20b8-24ee-88d5-e1addc43d0a2.png" width="300">|
|:-:|:-:|




##調理前の題材

|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/eed426d0-489b-601e-ff20-1e3e306d0749.png" width="300">|
|:-:|

まっしろしろすけ。iPhone8+の実機のスクリーンショット。

はじめて iPhone のアプリを作ったのならこれでも結構な感動があると思います。そう Hello World レベルならば。
すぐに気が付く点は

- ステータスバーとツールバーが白くて初心者っぽい
- 各行が詰まりすぎてて見にくい（Marginが無い）
- 各行の分割線が微妙な長さで気になる（iOSあるある）

ひとまずはこの辺りでしょうか。 

##対策第１弾
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/6155ff61-b5fb-bd1c-7779-b846ee24effb.png" width="300">|
|:-:|

以外にこれだけでも、ちょっとリッチになった気がしますね。

- ステータスバーとタイトル部分を Qiita 色にする
- ページタイトルの文字を白色に
- 分割線を表示しない
- 各行にちょっぴりマージン

こんだけ。
この時点でさらに気になるポイントは

- コンテンツが目立ってない
- ステータスバーの文字色も白色にしたい
- 各行の境界線がわかりにくい

##対策第２弾

|区切り線なし<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/4b935310-2e9b-38f8-3e9b-ddfc3c9886ae.png" width="300">|区切り線あり<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/53a0642e-b906-84fd-cef8-3a4fc6d821d7.png" width="300">|
|:-:|:-:|

これぐらいまで来るとHello World感は無くなって、爽やかな軽い感じになりますね。


- ステータスバーの文字を白色に
- タイトルの文字がクリッピングされずに折り返されるように
- 各行に適度なPadding追加

これぐらいで合格点と言っていいと思いますが、少し欲張ってみましょう。

- コンテンツをさらに目立たせる
- Z軸を強調する（奥行表現）

##対策第３弾
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/eceb2e16-06d1-1e17-bf54-04453cb5a3c6.png" width="300">|
|:-:|

う、うーん。コレジャナイ感って奴ですね。

これはXamarin.Formsのdefault visualのFrame要素で実現しています。
実はXamarin.Formsにはいわゆるマテリアルデザインテーマがあり、iOSでも比較的容易にマテリアルデザイン風味を実現可能なのですが正直現時点では完成度に難があり完全とは言えない状況です。（iOSにおけるマテリアルデザインの是非は置いといて）

じゃあってことでドロップシャドウというより放射ブラーみたいになってる影をやめて縁取りだけだとどうでしょうか。

|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/9aab0458-3752-e6e3-a130-d3d37ec33a49.png" width="300">|
|:-:|

なんか違う。角丸のアールが古いのか。微調整。

|縁取りあり<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/b0b11b48-5f3b-77fc-7dd0-2e0bec9bb299.png" width="300">|縁取りなし<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/26ef56f0-6003-02c0-b1a1-3551c0d17b70.png" width="300">|
|:-:|:-:|

MarginとPaddingを少し調整して、リストの背景色も調整してみました。
個人的にはこれぐらいやっとくと好印象になります。
実行時性能を犠牲にしてでもXamlで凝りに凝った装飾を施すとXamlだけでももう少し上を狙えます。
が、その限界を超える手段がXamarin.Formsのカスタムレンダラーを使うことで可能になります。

- コンテンツに半透明のドロップシャドウをつけたい
- タイトルとリストの間に半透明のエッジシャドウをつけたい

##対策第４弾（カスタムレンダラー投入）
|ドロップシャドウなし<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/26ef56f0-6003-02c0-b1a1-3551c0d17b70.png" width="300">|ドロップシャドウあり<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/4c519f46-499f-3368-fc0e-0a07b5b1efa1.png" width="300">|
|:-:|:-:|

カスタムレンダラー（iOSネイティブの描画）を使ったドロップシャドウの表現。
この時、行間とシャドウの色味や透明度を調整しないと[マッハバンド](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%83%E3%83%8F%E3%83%90%E3%83%B3%E3%83%89)が出ることがあるので注意してください。

このレンダリング結果だと、ページタイトルの奥行とリストの奥行が同じで、その上にコンテンツが被さっているように見える。
なので、ページタイトルとコンテンツの奥行を同じにするためにリストが奥になるような表現を追加する。

|エッジシャドウなし<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/4c519f46-499f-3368-fc0e-0a07b5b1efa1.png" width="300">|エッジシャドウあり<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/428404c3-c051-9be9-7a25-597d909578a2.png" width="300">|
|:-:|:-:|

##対策おまけ（グラデーション塗り）

|グラデーション塗りなし |グラデーション塗り浅め |グラデーション塗り濃いめ |
|:-:|:-:|:-:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/428404c3-c051-9be9-7a25-597d909578a2.png" width="300">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/be2844c5-d4dc-f7c1-c78b-3cc2bd9efe33.png" width="300">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/fca8b1ab-20b8-24ee-88d5-e1addc43d0a2.png" width="300">|

##最後に
こういう分野って個人の主観というか好みもあり、一概でどういうのがクールとは言えない面があると思います。
その一方で、これはちょっとダサいかもっていう多くの人に共有される常識のようなものもあると思います。
この記事を最後までご覧いただいた方にとって、どの小技が効果的だと思われたでしょうか？

比較的多用されるテクニックの１つにコントラストを下げるというのがあります、明度が高いとエッジが目立って古臭い感じになるので彩度を落として淡い色合いを使う。
しかし、これは格好いい見た目になっても読みやすいかどうかは別の話だと個人的には思っています。やはり自分が使う上では機能性が一番重要なのでコンテンツを最も強調することが最優先でその上での見た目かなと。

本記事のソースコードはすべて↓ここにあります。（急遽書いたのでコードの品質や実現手段の正しさは保証しませんし、バグってるとこもあります）
https://github.com/fuku518/Goose

それでは、良いプログラミングライフを！




###おまけのおまけ
Qiita APIでは記事タイトル以外にいろいろな情報が取れるので、きちんと出すとオレオレQiita非公式クライアントアプリを作るのも容易でしょう。
記事サマリー、タグ、like数、著者名、タイムスタンプなどを出すだけで、ぐっとスマホアプリらしくなります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31737/cb73cef9-1747-b42e-fe42-996747d29c81.png" width="300">