寒川アクアブログ

美容師しながらアプリ開発していて水草が趣味の私のブログです

doubleの値を、カンマつきの文字列に変換

1234567(double) を
1,234,567(String) に変換します。

double value = 1234567d;

DecimalFormat df = new DecimalFormat("#,##0.###");

String string = df.format(value);


コンストラクターのパラメーターはフォーマットのルールの定義のようなもので
0 は、値が無くても0を表示する
# は、値が0以外なら表示、0なら何も表示しない

上記の例なら小数点以下第3位までを表示し、整数の部分は3桁おきにカンマが入ります。

でも小数点以下は3桁までしか表示されないのに、整数は"1,234,567"のように、4桁で縛られることはなく、

カンマも入れてくれています。ここらへんがいまいち分かってないです・・・


電卓などの計算結果を表示するときに、手動でカンマを、

小数点の位置から、無ければ右端から3桁おきに","を挿入、先頭と"-"記号の右には入れない、

というふうにしていたので、かなり便利なクラスです!笑

独自に用意したフォントを使う

開発していると、デフォルトのフォントで日本語を表示すると、
なんかオシャレ感に欠ける・・・ということがあります。
シンプルな概観や、洗練された印象を与えるには、フォントの効果は少なからずあるかと思います。
以下、自分で用意したフォントをアプリに組み込む方法です。

フォントを用意する

Android Studioの左側のエクスプローラー風のビューから、mainフォルダを選択し、右クリック → New → Directory を選び「assets」という名前のフォルダを作成。
mainフォルダが見当たらないときは、表示をProject表示に切り替えてみてください。

その中に、フォントファイルを入れる。

f:id:kentaro198477:20160907202758j:plain

Roboto-Light.ttfというフォントを入れました。マテリアルデザイン推奨のフォントです。

以下のリンクからダウンロードできます。
Roboto & Noto fonts - Resources - Material design guidelines

コードから利用する
Typeface tf = Typeface.createFromAsset(getAssets(),"Roboto-Light.ttf");
    //    フォントのファイル名を拡張子まで全て入れます。

yourTextView.setTypeface(tf);

setTypefaceメソッドが使えるビューや、Paintに渡してキャンバス内の描画にも利用できます。



フォントによっては、商業利用ができないものもありますので、フォントの利用規約を必ずお読みください。

小数点以下第n位にdoubleを丸める

例えば電卓アプリなどで計算結果を表示する際、
割り切れない数値を、小数点以下第○位まで丸めて表示する方法です。

例として、10÷6の結果を、小数点以下第4位を四捨五入して、第三位まで表示してみます。

double value = 10d / 6d; 
BigDecimal bd = new BigDecimal(value);

パラメーターとしてvalueを与えてBigDecimalインスタンスを作成します。

valueの値は、1.6666666666666667になっています。

bdの値は、1.6666666666666667406815349750104360282421112060546875となっています。

(↑ここらへんはどういう仕組みでそうなるのか分かりませんが、コンピューター的な現象なのでしょう笑)


小数点以下3位に四捨五入して丸めます。

BigDecimal bigDecimal = bd.setScale(3, BigDecimal.ROUND_HALF_UP);
String string = bigDecimal.toString();

新たにBigDecimal型の変数を用意して、先ほどのBigDecimalのsetScaleメソッドで目的の値を格納します。

setScale( 第何位まで , 端数処理の方法)

BigDecimalクラスのtoString()メソッドで、文字列を取得します。

文字列 "1.667" が取得できました。

日常的な電卓としては、とても見やすい表示になりました!



端数処理方法の定数は、他にもいろいろありますが、電卓で使うのは以下のあたりでしょうか。

ROUND_DOWN (切捨て)

ROUND_UP (切り上げ)


BigDecimalクラスを使うと、計算の精度は上がりますが、パフォーマンスは低下するそうです。

「友達に紹介する」機能を実装する

個人でアプリを開発している場合、
なかなかユーザー数が増えないのが悩みのタネです。

インパクトのあるゲームなら、ツイッターによる拡散やユーチューバーが紹介したりすると、
爆発的にダウンロードが増えたりもしますが、

堅実なツール系のアプリだと、そのような奇跡はなかなか起こりません(笑)

せめて、気に入ってくれたらお友達に紹介してくれたりすると、
多少はダウンロードしていただけるのでは、と思い、
「友達に紹介する」ボタンを実装してみました。

他のアプリに、文字列を渡すためのコード
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "キャッチ文" + 
    "\n https://play.google.com/store/apps/〇〇〇〇");
startActivity(intent);

Intent.ACTION_SENDを指定すると、他のアプリに文字列を渡します。

setType("text/plain")では、文字列のデータを指定しています。
画像も渡すことができるので、おしゃれなUIだったら使いたいところです。

putExtra()の第2引数で、要となるテキストを指定します。
例では、キャッチ文と、改行のあとにグーグルプレイのアドレスを載せています。

(改行は、文字列内の改行したいところに \n を挿入します)

最後にstartActivity(intent)で、あとはよろしく~といった具合に丸投げして完了です!


Intent.ACTION_SENDにより、
例えばメールアプリが選択されたときは、本文に上記の、

キャッチ文
https://play.google.com/store/apps/〇〇〇〇


が入力された状態で、件名・宛先は未入力の状態でユーザーに向けて開かれます。

試しに自分宛にメール送信してみたところ、アドレスの所はリンクテキストに自動的に変わるので、
要件はクリアできているかと思います。

グーグルプレイのアプリ詳細ページに移動するコードです。

合わせて実装したい、「ご意見、ご感想」などに適したインテントです。
プレイストアのアプリ紹介ページへジャンプします。

Uri uri = Uri.parse("market://details?id=パッケージ名");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
これらを実装した例です。

f:id:kentaro198477:20160715210940j:plain

この実装例では、PreferenceActivityに、
PreferenceScreenにタイトルだけを表示して、上記のインテントを発行するボタンとして利用しています。
これの実装方法は、前エントリーでご紹介しています。
よければご参考にしてください。
kojiko-android.hatenablog.com


今回参考にさせていただいたサイト様です。
techbooster.jpn.org

PreferenceActivityに、空のボタンを実装する

PreferenceActivityでは、チェックボックスやスイッチを簡単に実装できますが、
一つの行にタイトルだけを表示し、ボタンのようにタップしたら何かを実行したい。
そのような領域を作成するには、PreferenceScreenを利用します。

xmlでPreferenceScreenを配置します。
<PreferenceScreen
    android:title="タイトルの文字列"
    android:key="SAMPLE_KEY">
</PreferenceScreen>

(他のウィジェットのように、サマリーを指定することもできます)

keyは、PreferenceActivity内から
(PreferenceScreen) findPreference("SAMPLE_KEY")
のようにして探す際に必要です。

クリックを検出する

PreferenceActivityのオンクリエイト等で、以下のように記述します。

PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("SAMPLE_KEY");
preferenceScreen.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
        //    実行したい処理
        return true;
    }
});

通常のボタンのように、クリックリスナーをセットして、実行したい処理を記述します。
例えば、「開発者にメールを送る」、
「シェアする」等の項目を追加するときに便利です。

フリック操作を検出する方法

ユーザーによるフリック操作の検出と、その方向を検出する方法の例

変数の定義
private GestureDetector gestureDetector; 
private enum Type {
        UP,
        DOWN,
        RIGHT,
        LEFT,
    } 

方向を表す上下左右の4種類の列挙型を定義します。
フリックの方向によって、これら4つの型の中からどれか一つを返します。

フリック検出のためのリスナーを宣言します
@Override
public boolean onTouchEvent(MotionEvent event) {
    return gestureDetector.onTouchEvent(event);

  //    GestureDetectorにイベントを渡すために必要です

}


private final GestureDetector.SimpleOnGestureListener mOnGestureListener = new 
GestureDetector.SimpleOnGestureListener(){
   @Override
    public boolean onDown(MotionEvent e) {

        return true;

    }


    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Type type ;
        float startX = e1.getX();
        float startY = e1.getY();
        float nowX = e2.getX();
        float nowY = e2.getY();
        float absX = Math.abs(nowX - startX);
        float absY = Math.abs(nowY - startY);

    //    フリック開始時のx,y座標、終了時のx,y座標を保持
    //    指の移動距離の絶対値

        if (absX + absY < 50 )return false;

    //    誤作動を防ぐため、移動距離が短い時は何もしない。調節してください


        if (absX > absY){

        //    横方向の操作の場合

            if (nowX - startX < 0) {
                type = Type.LEFT;
            } else {
                type = Type.RIGHT;
            }
        } else {

        //    縦方向の操作の場合

            if (nowY - startY < 0) {
                type = Type.UP;
            } else {
                type = Type.DOWN;
            }
        }

        Log.d("hogehoge",type.toString());

        //    ログに方向を表示

        return true;

    }
};

コードの働きについては、アウトコメントをご参照ください。といっても、それほど難しいことはしていません。
typeの値によって、どの方向にフリックされたかが示されますので、その後の処理をわけてください。

余談ですが、hoge って何なんでしょう(笑)。アンドロイドの参考書や、技術ブログによく登場しますね。
ログに吐き出させるときは、めんどうなのでhogehogeとしていますが、まず他とかぶらないので結構便利な言葉かもしれません。

Androidアプリ タイマープラス(無料・有料)

タイマープラス

Androidアプリ
無料・有料
play.google.com

f:id:kentaro198477:20160707140222p:plain

お料理に、勉強に、ヨガやエクササイズに・・・etc。
 タイマープラスは、シンプルなキッチンタイマーと、簡単に使いこなせる便利な機能を備えています。
無料版・有料版ともに、同一の機能について、ご紹介します。

本物のデジタルタイマーのような操作性

f:id:kentaro198477:20160707140305p:plain
タイマープラスは、複雑な機能を省き、誰にでも簡単に使いこなせるように設計されています。
飽きがこないよう、ルックスも可能な限りシンプルにしました。

お気に入りの登録

f:id:kentaro198477:20160707140946p:plain
 『パスタ8分』、『ヨガ30分』など、よく使う時間はプリセットに保存し、少ないタップでスタートできます。
 時間を入力した際に、左に表示される+マークをタップします。お気に入りタイマーを使用するには、
ツールバーのタイマーアイコン(有料版はハートマーク)をタップすると、リストを表示します。

テーマのカスタマイズ

f:id:kentaro198477:20160707141015p:plain
 タイトルバーやボタンをお好きな色にカスタマイズ。仕上がりをチェックしながらアレンジできます。
 編集したいアイテムを選び、バーで色を調節します。バーは、上から、色相、彩度、明度に対応します。右のチェックボックスにチェックを入れると、全てのアイテムの値を一斉に操作します。カスタマイズモードへ移行する際は、滑らかなアニメーションを伴っています。

鳴動時ポップアップ・シェイクスヌーズ

f:id:kentaro198477:20160707141131p:plain
 時間になると、アプリを終了していても、ダイアログがポップアップされ、お知らせします。
 お昼寝に使用したときは、幸せな二度寝をサポートします。タイマーが鳴っているときに端末をシェイクすると、同じ時間でタイマーがスタートします。目を開ける必要がありません。
 シェイクスヌーズは設定で有効・無効変更可能

いつでも確認・変更できる通知設定

f:id:kentaro198477:20160707141116p:plain
 ツールバーの”♪”をタップすると、通知設定ダイアログをポップアップします。
「どれくらいの音量で鳴るんだっけ・・・」そう思ったらいつでも確認・変更ができます。
ボリュームは、消音から端末の最大音量までの間で調整が可能です。
”テスト”をタップすると、設定した値でプレビュー再生します。鳴動時は、これと全く同じ条件で再生・振動します。

バックスペースキー

f:id:kentaro198477:20160707141037p:plain
 間違えて入力したときに一文字消すバックスペースキーは、必要性は薄いですが、少しだけストレスが減ります。

カウントアップ機能

f:id:kentaro198477:20160707141057p:plain
 タイマー表示が00:00の時にスタートをタップすると、カウントアップを開始します。
1000分の1秒単位で計測。アプリを終了してもカウントを続けます。

通知バー内で、残り時間表示

 アプリを起動していなくても、通知バーを上から引き出せば、残り時間を確認できます。表示は一秒ごとに更新。

タッチフィードバック

 ボタンを『押した感』を大事にしました。タップした時は、短い振動、見た目の変化、ビープ音でフィードバックを返します。

ユーザー様の声を反映

 タイマープラスでは、レビューに寄せられるアイデア、不満点を極力反映し、”プラス”したアップデートを繰り返してきました。
この場で感謝申し上げます。ありがとうございます!



■仕様■
・設定上限
99:99まで。秒の入力が60以上の場合は分に繰り上げ表示(02:70→03:10)、分が99を超える場合は繰り上げしません。

・選択できるテーマ(現行バージョン)
作成したテーマ、起動のたびにランダム、ホワイト、ブラック、ブルー、ピンク、グリーン、ブラウン、オレンジ、アイボリー、蜂蜜、牡蠣、星空、チョコレートミント、レトロ、ストロベリー、ラベンダー、カモフラージュ

・オプション項目
テーマ変更
ステータスバーを隠す
シェイクスヌーズの有効・無効
スリープモードにしない有効・無効
ボタンタップ時の振動・ビープ音の有効・無効


このアプリの開発者は、安心・安全なアプリの開発者であるとしてアンドロイダーの公認デベロッパーに認証されています。https://androider.jp/developer/e650a2000859a80e19cf7a7950e026a8/

———————————————————————
アンドロイドアプリ総合情報サイト「AndroidView/アンドロイドビュー」に掲載中
http://androidview.jp/
———————————————————————

無料版

広告が表示されます。機能は有料版と同等です。
play.google.com

有料版

広告は表示されません。また、いっさいの通信を行いません。
ツールバーのデザインが無料版と少し違いがあります。

play.google.com