Smoking Note V1.3.2 アップデート

喫煙管理アプリ「Smoking Note」のアップデートを行いました。

V1.3.2 アップデート内容

  • 日付変更時間の設定機能を追加しました。
  • 喫煙データの初期化機能を追加しました。
  • 煙エフェクトの設定機能を追加しました。
  • いっぷくボタンを押したとき煙エフェクトをかけるようにしました。
  • 思いとどまりカウンタを削除しました。
  • 前回の記録表示スイッチボタンを削除しました。
  • アプリ全体をフラットデザインからマテリアルデザインに変更しました。
  • 対応するプラットフォームをAndroid5.0以上に変更しました。ご了承ください。

今回のアップデートは、ご利用されている方から頂いた日付変更時間(リセット時間)の設定機能がほしいというリクエストに対応するため実施しました。ついでに煙エフェクトや広告についての説明など前から追加したいと思っていたアイデアの実装と、思いとどまりボタンや前回の記録表示スイッチといった微妙な機能の削除を行いました。

前回のアップデートから約一年。今回UIライブラリOnsen UIのバージョンを1.3.71から2.10.1にバージョンアップしたこともあり、アプリのデザインを全体的に変更しました。はじめてアプリをリリースした頃はフラットデザインという言葉をよく目にしたため見よう見まねで取り入れたのですが、今回はマテリアルデザインに変更しました。Android OSはGoogleが開発しているわけですが、そのGoogleがマテリアルデザインのガイドラインを公開していたり、Onsen UIのV2では「すべてのコンポーネントでiOSとAndroidマテリアルデザインに対応し、実行する端末にあわせて自動的にスタイルを切り替えます。」と説明されています。実際に取り入れてみると影による立体感のおかげでボタンなどが視認しやすくなったと感じました。よろしければ使ってみてください(たばこを吸わない方でもカウンターとして使えますよー)。




Google Play で手に入れよう

MonacaでFont Awesome 5を使ってみました

MonacaクラウドIDEで作成したOnsen UIのプロジェクトからFont Awesomeのバージョン5のアイコンを使いたくて調べてみました。MonacaクラウドIDEもFont Awesomeもひさしぶりにさわったのですが、いつの間にか進化していて戸惑いました。諸行無常を感じます。

Note

  • 本記事で利用するFont Awesomeのバージョンは5.0.13です。
  • MonacaクラウドIDEはバージョンが分からなかったのですが、2018/6時点のものになります。
  • Font Awesomeのファイルについて、記事ではminify(コード圧縮)されたファイル(.min.css)を使用していますが、minify無しのファイルに読み替えても差し支えありません。

Font Awesome 5

Font Awesomeはバージョン5から使い方が変更されたようです。私は今頃気が付きました。公式サイトをざっと見たところ使い方が4種類あるようです。

  • Web Fonts with CSS
  • SVG with JS
  • Desktop Use
  • Advanced

公式サイトの「How to Use」のページではSVG with JavaScriptにお勧めマークRECOMMENDEDがついています。SVGはベクター画像なので解像度の違いで拡大縮小が発生してもきれいに表示できるという利点があります。

このほかに変更された点は、アイコンが4種類のスタイルを持ったことです。

  • Solid
  • Regular
  • Light
  • Brands

これらのスタイルはそれぞれ対応するクラスを指定して利用します。これまではfaクラスを指定していましたが、バージョン5からはスタイルに合わせてfas、far、fal、fabクラスを指定することになります。

ちなみにRegularは一部有料版、Lightはすべて有料版のようです。無料で利用したい場合はアイコン名だけではなく、スタイルが利用可能かどうかを確認する必要があります。公式サイトの「Icons」のページでは、左側のメニューからSolidなどのスタイルや無料(Free)、有料(Pro)の絞り込みをすることができます。

MonacaクラウドIDE

Onsen UIのプロジェクトを作成すると既にFont Awesomeの設置と読み込みの記述がされているため、自分でlinkなどの記述をしなくてもFont Awesomeを利用できる状態になっています。

<link rel="stylesheet" href="lib/onsenui/css/onsenui.css">

/*! onsenui - v2.10.1 - 2018-06-08 */
@import url("ionicons/css/ionicons.min.css");
@import url("material-design-iconic-font/css/material-design-iconic-font.min.css");
@import url("font_awesome/css/font-awesome.min.css");

*  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome

Font Awesomeのバージョンは4.7.0のようです。

Font Awesome 5の導入例

Font Awesome 5を使うために調べたことや作業の過程をご紹介します。やりかたはたくさんあると思いますので、ほんの一例として見て頂けたらと思います。

(1)デフォルト設置のFont Awesome 4.7.0の削除

基本的に外部のJavaScriptやCSSのライブラリをプロジェクトへ追加・削除したいときは、MonacaクラウドIDEの設定メニューにある「JS/CSSコンポーネントの追加と削除…」から行いますが、デフォルトで設置されているFont Awesomeはcomponentsフォルダではなくlibフォルダのほうにあり、この設定画面では認識されず削除することができません。

そこで手動で削除します。消し残しがあるとトラブルの元になるので慎重に。編集メニューのプロジェクト内検索で「font_awesome」を検索してみます。すると以下の3か所がヒットしました。

  • /www/lib/onsenui/css/onsenui-fonts.css
  • /www/lib/onsenui/css/onsenui.min.css
  • /www/lib/onsenui/css/onsenui.css

プロジェクト内でFont AwesomeにふれているのはOnsen UIのCSSファイルだけのようです。「onsenui-fonts.css」、「onsenui.min.css」を検索すると一つもヒットしないため、この2ファイルは現在使われていないようです。

onsenui.cssを開き、Font Awesomeを読み込んでいる行をコメントアウトします。今回はついでということで他のWebフォントを読み込んでいる行もまとめてコメントアウトしました。

/*! onsenui - v2.10.1 - 2018-06-08 */
/*
@import url("ionicons/css/ionicons.min.css");
@import url("material-design-iconic-font/css/material-design-iconic-font.min.css");
@import url("font_awesome/css/font-awesome.min.css");
*/

次にWebフォントの本体をフォルダごと削除します。

  • /www/lib/onsenui/css/font_awesome
  • /www/lib/onsenui/css/ionicons
  • /www/lib/onsenui/css/material-desigh-iconic-font

(2)Font Awesome 5の設置

今回はさくっと簡単に表示したいので、これまでと同じ匂いのするWeb Fonts with CSSの方法を使います。

Font Awesomeの読み込みはCDNを利用する方法とファイルをサーバにアップロードして行う方法がありますが、今回はオフラインでも安心なアップロードする方法にします。

MonacaクラウドIDEの「JS/CSSコンポーネントの追加と削除…」を使用するとライブラリの設置が簡単にできます。とても便利なのですが、その代わり余計なファイルがたくさんくっついてくるため、今回は手動で行います。

「JS/CSSコンポーネントの追加と削除…」を実行した場合

今回必要なのはweb-fonts-with-cssのなかの数ファイルのみ。不要なファイルやフォルダをIDE上でひとつひとつ削除するのがちょっとめんどいです。APKを構築するためのビルド機能に、実際に使われている関数やCSSのみ抜き出すリンカのような仕組みがあれば不要なファイルを気にしなくていいと思うのですが。

まず、Font Awesomeの公式サイトのトップページからファイルをダウンロードします。「Download Free」ボタンを押すとfontawesome-free-5.0.13.zipというファイルがダウンロードされます。

https://fontawesome.com/

ダウンロードしたZIPファイルを解凍します。ここから必要なファイルだけプロジェクトに追加します。今回はバージョン5.0.13で追加された「かえる」のアイコン(fa-frog)を表示してみます。スタイルはSolidです。

今回必要なファイルは以下の7つになります。

web-fonts-with-css/cssフォルダ内

  • fa-solid.min.css
  • fontawesome.min.css

web-fonts-with-css/webfontsフォルダ内

  • fa-solid-900.eot
  • fa-solid-900.svg
  • fa-solid-900.ttf
  • fa-solid-900.woff
  • fa-solid-900.woff2

fa-solid.cssの中身を覗いてみると、@font-faceで指定しているフォントファイル(eot, svg, ttf, woff, woff2)へのパスが一階層上の「webfonts」という名称のフォルダを指しています。

@font-face {
  font-family: 'Font Awesome 5 Free';
  font-style: normal;
  font-weight: 900;
  src: url("../webfonts/fa-solid-900.eot");
  src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }

そこで、MonacaクラウドIDE上でlibフォルダの下にfontawesomeフォルダ(名称任意)を作成し、そのなかにcssフォルダ(名称任意)と「webfonts」フォルダを作成します。

次に、それぞれのフォルダに前述のファイルをアップロードします。

アップロード完了

Note

Onsen UIをアップデートした場合、onsenui.cssでFont Awesomeをimportしている行を再度コメントアウトする必要があります。Font Awesome本体も復活すると思います。これらのパスはcomponents/loader.cssによりwww/components側に変わると思われるので確認が必要です。

(3)Font Awesome 5の読み込み

index.htmlから、文字コードを格納しているfontawesome.min.cssと、@font-faceを記述しているfa-solid.min.cssを読み込みます。

<link rel="stylesheet" href="lib/fontawesome/css/fa-solid.min.css">
<link rel="stylesheet" href="lib/fontawesome/css/fontawesome.min.css">

i要素でfasクラスとfa-frogクラスを指定してFont Awesomeのバージョン5のアイコンを表示させてみます。今回は実験的にons-iconコンポーネントも使ってみます。

<i class="fas fa-frog" style="font-size: 100px; color: green"></i>
<ons-icon icon="fa-frog" size="100px" style="color: green"></ons-icon>

Monacaデバッガで撮ったスクショ

表示することができました!

ons-iconコンポーネント使用時の注意点

ons-iconコンポーネントを使う場合はファイルを読み込む順番に注意が必要です。ons-iconコンポーネントはons-iconクラスとfaクラスを生成します。ここで問題になるのがfont-weightプロパティの上書きです。

ons-iconクラスではFont Awesomeのスタイルを分類するfont-weightプロパティをnormalに設定します。

.ons-icon {
  display: inline-block;
  line-height: inherit;
  font-style: normal;
  font-weight: normal;
  font-size: inherit;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

normalの値は「400」ですが、これはRegularスタイルと同値になります。

.fa,
.fas {
  font-family: 'Font Awesome 5 Free';
  font-weight: 900; }

.far {
  font-family: 'Font Awesome 5 Free';
  font-weight: 400; }

つまり、ons-iconコンポーネントではons-iconクラスによるRegularスタイルの指定とfaクラスによるSolidスタイルの指定が混在していることになります。

かえるの実験ではFont Awesomeのファイルを読み込んだ後にonsenui.cssを読み込んでいました。このケースでは、font-weightが「normal」となりRegularスタイルを指定したことになりますが、Regularスタイルのフォントファイルを読み込んでいないためウェイトのフォールバックでSolidスタイルのフォントファイルが使われたと考えられます。もしRegularスタイルのフォントファイルも一緒に読み込んでいた場合は、farクラスを指定していなくてもRegularスタイルのアイコンが表示されるという怪奇現象になりますし、Regularスタイルに非対応のアイコンであれば表示すらされません。

ons-iconコンポーネントを使うのであれば、onsenui.cssを読み込んだ後にFont Awesomeのファイルを読み込むことで、ons-iconクラスによるfont-weightの上書きを防げます。また、SolidスタイルとRegularスタイルのフォントファイルを一緒に読み込むときは、fa-solid.cssを読み込んだ後にfa-regular.cssを読み込むことでfaクラスによるfont-weightの上書きを防げます。

以下にons-iconコンポーネントを使用してSolidスタイルとRegularスタイルのアイコンを表示する例を示します。(Regularスタイル用のファイル一式を追加でアップロードしています)

<link rel="stylesheet" href="components/loader.css">
<link rel="stylesheet" href="lib/onsenui/css/onsenui.css">
<link rel="stylesheet" href="lib/onsenui/css/onsen-css-components.css">

<link rel="stylesheet" href="lib/fontawesome/css/fa-solid.min.css">
<link rel="stylesheet" href="lib/fontawesome/css/fa-regular.min.css">
<link rel="stylesheet" href="lib/fontawesome/css/fontawesome.min.css">

<link rel="stylesheet" href="css/style.css">

<ons-icon icon="fa-bell" size="100px" style="color: yellow"></ons-icon>
<ons-icon icon="fa-bell" size="100px" style="color: yellow" class="fas"></ons-icon>
<ons-icon icon="fa-bell" size="100px" style="color: yellow" class="far"></ons-icon>

Monacaデバッガで撮ったスクショ

表示はできましたが、本来不要であるファイルの依存関係ができてしまいました。私はこのやり方を忘れる自信があります。

まとめ

  • 現在のOnsen UIのプロジェクトではFont Awesomeのバージョン4.7.0が使われている
  • Awesomeのバージョン5を使う場合は、重複を防ぐためバージョン4.7.0を削除する(読み込みはonsenui.cssで行われている)
  • Font Awesomeのスタイル定義ファイル(fa-solid.cssなど)では、一階層上の「webfonts」フォルダへのパスが使われているので注意
  • 現時点ではons-iconコンポーネントはとりあえずi要素に変更したほうが安心
  • 開発環境やツールなどの変化は速いのでたまにさわっておいたほうがいい

Blenderブロックの作り方

無料ではじめるBlender CGイラストテクニック(大澤龍一 著)の「CHAPTER03 ポリゴンモデリング2」に掲載されているブロックを作ってみました。

このブロックは長方形の土台に8つの円柱がくっついたシンプルな形をしていますが

  • ループカット
  • 面の差し込み
  • 押し出し
  • 細分割曲面モディファイア
  • べベル

といったモデリングの基本的な機能が複数使われています。

書籍では制作過程を5つのパートに分け、順を追ってモデリングの仕方を解説しています。その通りに進めればブロックが作れるわけですが、Blender初心者の私は主旨と関係ない事柄も含めあちこちでつまずいてしまい、いったんネットで調べたり実験して確かめながらブロックを完成させました。

そこで書籍の5つのパートをフォローする形でディテールとTipsを追加してみようと思います。書籍のように紙面の制限があるわけではないので画像をたくさん使いました(おかげでちょっとくどくなった感じもしますが)。

Tipsを抜き出すと以下のようになります。

1.ループカット

(1)オブジェクトモードで立方体を作成

Shift+A▶ メッシュ ▶ 立方体

(2)編集モードに切り替え

TAB

(3)立方体を拡大

X方向に4倍:SX4Enter

Y方向に2倍:SY2Enter

拡大縮小ができなくなったとき

オブジェクトモードで「原点の操作」が有効になっていると「オブジェクトの移動はできるのに拡大縮小と回転ができない」という悲しみモードになります。これは「原点の操作」を無効に戻すことで解決できます。「原点の操作」設定ボタンは、下のツールバーに配置されている、三つの丸に矢印というシンプルで視認性が高く意味不明な外観のボタンです。

無効時:白っぽい
有効時:黒っぽい

「原点の操作」はオブジェクトモードで複数のオブジェクトを選択して使用します。拡大縮小や回転の操作を行うと、各オブジェクトの原点の座標だけを動かします。編集モードでは機能しませんし「原点の操作」設定ボタンもありません。

(4)ループカット

X方向に4等分:Ctrl+R

Y方向に半分:Ctrl+R

2.面の差し込み

(1)面選択モードにして8つの上面を選択

Shift+ 右クリック × 8回

(2)個別の面差し込み

Iを押した状態で

続けてIを押します。

または、面の差し込みを確定した後、ツールバーの「面を差し込む」から「個別」をチェックします。

T▶ 面を差し込む:個別

なお、すでに個別の設定になっている場合はIを一回押すだけで個別の面差し込みになります。

面の差し込みやベベルがうまくいかないとき

面の差し込みをすると面の周辺の幅が均一にならないことがあります。

また、ベベルを使用すると選択した辺から左右対称にかからないことがあります。

このオブジェクトは立方体をY方向へ4倍拡大しています。左右の違いは拡大操作を行ったときのモードのみです。

  • 左側のオブジェクト:編集モードに切り替えてから拡大
  • 右側のオブジェクト:オブジェクトモードで拡大

オブジェクトモードで拡大すると、オブジェクトが保持しているトランスフォームの拡大縮小値が更新されます。この値が面の差し込みやベベルに影響するようです。

右側のオブジェクトは拡大縮小の比率が(X:1, Y:4, Z:1)となっており、実際Y方向への変化量が4倍になっているように見えます。

N▶ トランスフォーム:拡大縮小

このトランスフォームの拡大縮小値はオブジェクトモードでトランスフォーム値の適用をするとリセットできます。

Ctrl+A▶ 拡大縮小

トランスフォーム値の適用を行うと、現在の位置、回転、拡大縮小の値がオブジェクトの初期値となり、位置と回転は0、拡大縮小は1に設定されます。
今回の例では拡大縮小しかしていないので、トランスフォーム値の適用メニューから拡大縮小を選びます。これで面の差し込みやベベルがXYZ方向へ均一にかかるようになります。

蛇足になりますが、編集モードで拡大縮小してもトランスフォーム値は更新されません。そこで、

  • なぜ編集モードで行った拡大縮小の値をトランスフォーム値に反映させないようにしているのか
  • なぜオブジェクトの拡大縮小の値を面の差し込みやベベルで使用するようになっているのか

という疑問が浮かびました。実際にこの仕様を有効活用しているサンプルがあれば謎は解けそうですが、自分にはちょっとわからないのでそっと沈めておくことにします。

3.押し出し

(1)選択した面の押し出し

押し出し:E

ちなみにマウスを動かすときCtrlを押すとグリッド単位で動かせます。

(2)角を立たせるためのループカット

細分割曲面を適用したときに突起部分の角を立たせるためのループ辺を作成します。突起部分をループカットで3等分にして先端用と根元用にします。一気にはできないので一つずつループカットしていきます。カットする位置は右クリックでデフォルトの位置に揃えます。

ループカット3等分:Ctrl+R× 8回

重複頂点の削除について

押し出し中にマウスの右クリックやEscでキャンセルしても面のようなものが作られます。

この面について調べてみます。
まず、立方体を作成し、編集モードで面選択モードにします。

上面の押し出し中にマウスを右クリックし、押し出しをキャンセルします。

すると謎の黒点が出現!

一見、点に見えますが、頂点選択モードや辺選択モードにすると消えるので、面選択モードのときに表示される面の中心点だと思われます。

次に黒点を選択してみます。なかなか選択できず悩みましたが、Zでワイヤフレーム表示にしたら選択できました。もとからある面の内側に位置しているみたいです。

確認しやすくするためソリッド表示に戻し、Xからを削除してみます。すると黒点が消えました。やっぱり面だったようです。

以上の結果から、押し出しをキャンセルするとオブジェクトの形状は元に戻って見えるけど、実はこっそり面が作られているといえると思います。

意図的にキャンセルして面を作るのであれば問題ないと思いますが、知らずにモデリングを続けるとベベルがうまくかからないとかポリゴン操作中にこっそり作られた面が顔を出すなどトラブルの原因になります。

押し出し前の状態に戻すにはCtrl+Zで前に行った操作を取り消すか、Blenderの重複頂点を削除する機能を使います。

W▶ 重複頂点を削除

Ctrl+V▶ 重複頂点を削除

重複頂点の削除は選択した部分だけ処理の対象になるので、Aでオブジェクト全体を選択してから使用します。

4.細分割曲面モディファイア

(1)オブジェクトモードに切り替え

TAB

(2)細分割曲面モディファイア追加

プロパティのモディファイアタブから「細分割曲面モディファイア」を追加します。細分化のパラメータはビュー、レンダーともに3に設定します。

(3)シェーディングのスムーズを適用

T▶ シェーディング:スムーズ

(4)編集モードに切り替え

TAB

(5)突起部分の角を立てる

突起部分に作成したループ辺を移動してシャキッとさせます。

まずは上のループ辺をすべて選択し、先端のほうへ移動します。

同様に下のループ辺をすべて選択し、根元のほうへ移動します。

重複頂点の削除の注意点

ループカットで作成した辺を端に移動することで角を立たせました。端へ寄せれば寄せるほどシャキッとします。

3等分した状態から上の辺ループを移動してみます。

シャキッ

シャキシャキッ

ならば、限界まで寄せれば最シャキになるはず

最シャキ!

ところがこれ問題がありまして、この状態で重複頂点の削除(W▶ 重複頂点を削除)を行うと、ループカットした辺が消えてしまうのです。

重複頂点を削除することで突然モデルが変形するとか、なんかかっこいいですよね!
私は遠慮させていただきたいです。
以上、注意点でした。

5.べベル

(1)辺選択

土台の長方形の辺を選択します。

(2)ベベル適用

ベベルにより選択した辺の周辺にポリゴンが作られるため元の形に近くなります。

Ctrl+B

逆ベベル

最後にちょっと変わったベベルの使い方を紹介します。

Ctrl+Bを押したあと、続けてPを押すとベベルが逆カーブでかかります。


自動スムーズやベベルモディファイアを使用するといい感じになります。

完成