くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

AndroidのFAB(Floating Action Button)の色/サイズを変えたい

AndroidでFABのサイズを変えたかったので、いろいろ調べたときの備忘録
もとのサイズを変更しているので、正攻法じゃない感が半端ない&全体に適用されるけど。。

色を変える(Layout XMLのbackgroundTint)

色を変える場合は、backgroundTintすればOK

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:backgroundTint="@android:color/holo_blue_dark"
    app:fabSize="normal"
    app:srcCompat="@android:drawable/ic_dialog_email/>

サイズを変える(dimens.xmlで上書き)

dimens.xmlで元のサイズを上書きすることで、サイズを変更できる

<!-- fabSize="normal"のときのサイズ -->
<dimen name="design_fab_size_normal" tools:override="true">90dp</dimen>
<!-- fabSize="mini"のときのサイズ -->
<dimen name="design_fab_size_mini" tools:override="true">30dp</dimen>

<!-- アイコンのサイズ -->
<dimen name="design_fab_image_size" tools:override="true">@dimen/fab_icon_size</dimen>

サイズを変える場合は、XMLfabCustomSize属性もあるが。。。

FloatingActionButtonのfabCustomSizeで変更できそうだけど、
アイコンのサイズがいい感じならなかった。。

<android.support.design.widget.FloatingActionButton
    ・・・
    app:fabCustomSize="90dp"
    ・・・>

【宣伝】記念日カウントアップアプリをリリースしました!!

f:id:wannabe-jellyfish:20180904163438p:plain:w400

Android: Google Play

登録した記念日の経過した時間や日数をカウントアップするアプリです。
カップルや夫婦、友達の赤ちゃんの記念日や誕生日など、大切な日の記録に。

参考にしたサイト様

Android x Toolbar x SearchView|常に検索バーを表示していたい

Toolbarに検索バーを表示させたいなぁと思い、いろいろ調べたときの備忘録
ActionViewを使うサンプルはよくあるけど、タイトルの代わりに表示する例って少ない。。。

虫眼鏡アイコンを表示して、必要に応じて検索バーを表示する

よくあるサンプル。
検索ボタンをメニューに配置して、ボタンを押すと検索バーが開くやつ。
ActionViewを使って、Toolbarを変更する形

f:id:wannabe-jellyfish:20180904163049p:plain:w500

Layout XML

Toolbarはシンプルな形。

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay"/>
Menu XML

memuの方にSearchViewを追加すると表示できる

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
      <item
        android:id="@+id/menu_search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="Search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="collapseActionView|ifRoom"/>
    <item
        android:id="@+id/menu_info"
        android:icon="@android:drawable/ic_dialog_info"
        android:title="Info"
        app:showAsAction="always"/>
</menu>

常に検索バーを表示する

やりたかったやつ。
常にタイトルの代わりに検索バーを表示する場合は、ToolBarの中にSearchViewを配置。
SearchViewの左側の余白は、ToolbarのcontentInsetStartなどで調整

f:id:wannabe-jellyfish:20180904163321p:plain:w500

Layout XML
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:contentInsetStart="2dp"
    app:contentInsetStartWithNavigation="2dp"
    app:popupTheme="@style/AppTheme.PopupOverlay">

    <android.support.v7.widget.SearchView
        android:id="@+id/searchView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</android.support.v7.widget.Toolbar>
Menu XML

もちろん、SearchViewの横に従来のメニューも追加できる

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_info"
        android:icon="@android:drawable/ic_dialog_info"
        android:title="Info"
        app:showAsAction="always"/>
</menu>

便利なライブラリもあるっぽい

【宣伝】記念日カウントアップアプリをリリースしました!!

f:id:wannabe-jellyfish:20180904163438p:plain:w500

Android: Google Play

登録した記念日の経過した時間や日数をカウントアップするアプリです。
カップルや夫婦、友達の赤ちゃんの記念日や誕生日など、大切な日の記録に。

以上!!

参考にしたサイト様

Amazon Linux2+Apache+virtualenv+python3+Djangoでアプリをデプロイ

Amazon Linux2がリリース版になってから、Djangoアプリをデプロイしたので、
その時の備忘録φ(..)メモメモ

特に、python3のインストールがつらかった。。

各種バージョンは以下の感じ

$ cat /etc/system-release
Amazon Linux 2

$ httpd -v
Server version: Apache/2.4.33 ()
Server built:   Jun 15 2018 20:38:53

$ python3 -V
Python 3.7.0rc1
$ pip3 -V
pip 9.0.3 from /usr/lib/python3.7/site-packages (python 3.7)

インストール

## enable python3 for Amazon Linux2
$ sudo amazon-linux-extras enable python3

## instal httpd and python3
$ sudo yum install -y httpd-devel python3-devel gcc gcc-c++

aws-extrasリポジトリに、python3.6.2があるが、python3-develがない。。
やむなくaws-coreのpython3.7.0.rc1のpython3-develをインストール。。

仮想環境(Virtualenv)の作成

### setup virtual env
$ cd /var/www/cgi-bin/sample_app/
$ sudo pip3 install virtualenv
$ virtualenv -p python3.7 virtualenv     # create virtual env
$ . virtualenv/sampleApp/bin/activate # activate

### setup libraries
$ pip3 install -r require/require.txt

Djangowsgi.pyの設定

それぞれのパスは以下の感じ。

  • Django Projectのパス:/var/www/cgi-bin/sample_app/
  • virtualenvのパス: /var/www/cgi-bin/sample_app/virtualenv/
  • Django Projectのwsgi.pyのパス:/var/www/cgi-bin/sample_app/wsgi.py
  • Django Projectのstaticディレクトリのパス:/var/www/cgi-bin/sample_app/sample_app/static/

各種パスに応じて、wsgi.pyを変更する

変更前
import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sample_app.settings")
application = get_wsgi_application()
変更後
import os
import site
import sys

# ----------------------------------
# django projectのパス
PROJECT_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))

# virtualenvのパッケージパス
site.addsitedir(os.path.join(PROJECT_ROOT, 'virtualenv', 'lib', 'python3.7', 'site-packages'))
# django projectのパス
site.addsitedir(os.path.join(PROJECT_ROOT))
# ----------------------------------

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sample_app.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Apache(conf)

Apacheの設定として、Django用のconfファイルを作成する。 * /etc/httpd/conf.d/wsgi_django.conf

※ いろいろやったけどうまくいかないので、python自体とpip mod_wsgiは全体共通に。。

# install mod_wsgi using pip
$ sudo pip3 install mod_wsgi

# find mod_wsgi.so
$ find /usr/local/lib64/python3.7 -type f -name "mod_wsgi*.so"
 # => /usr/local/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so

# create
$ sudo vim /etc/httpd/conf.d/wsgi_django.conf
# describe found .so path
LoadModule wsgi_module /usr/local/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so

Alias /static /var/www/cgi-bin/sample_app/sample_app/static
<Directory /var/www/cgi-bin/sample_app/sample_app/static>
  Require all granted
</Directory>

WSGIScriptAlias / /var/www/cgi-bin/sample_app/sample_app/wsgi.py
<Directory /var/www/cgi-bin/cryptocurrency_web>
  Require all granted
</Directory>
# apache を再起動
$ sudo systemctl restart httpd

参考にしたサイト様

【小ネタ】Pythonでいい感じに固定小数点を表示する

formatの仕方はいろいろあるが、いい感じには表示してくれない...

  • "g".format(...)」だと、指数表示なってしまう
  • "f".format(...)」だと、有効桁まで0埋めされてしまう

固定小数表記で、無駄な0は表示してほしくない場合のフォーマットはないので、
rstripなどを駆使するしかないっぽい

# floatを固定小数表記でいい感じに表示する
def format_float(value):
  return "{:,.f}".format(value).rstrip('0').rstrip('.')

print(format_float(3.0))
# => 3

print(format_float(0.000003))
# => 0.000003
# 四捨五入
def format_float_int(value):
  return "{:,}".format(round(value))

参考にしたサイト様

Pythonで並列処理(Joblib)

Pythonで並列/並行処理するのは、Joblibがよいらしいので、使ってみた。ときの備忘録φ(..)メモメモ

インストール
$ pip install joblib
使い方
from joblib import Parallel, delayed

def do_execute(param):
    # 関数の処理
    
if __name__ == "__main__":
    # マルチプロセス
    result = Parallel(n_jobs=-1)(delayed(do_execute)(param) for param in [1, 2, 3])
    
    # マルチスレッド
    result = Parallel(n_jobs=-1, backend="threading")(delayed(do_execute)(param) for param in [1, 2, 3])

参考にしたサイト様

【Android】Tablayoutでタブの幅を広げたり、タブの文字サイズを変えたい

小ネタ。Tablayoutは便利。

タブレットでもタブの幅を広げる

Material Design的には、タブレットでタブが2個のときは、 タブのサイズを小さくするらしい。。

<android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMaxWidth="0dp"
            app:tabGravity="fill"
            app:tabMode="fixed" />

app:tabMaxWidth="0dp"が重要らしい

タブの文字サイズを変える

styleを作って、TextAppearanceを設定する感じらしい

<style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab">
    <item name="android:textSize">14sp</item>
    <item name="android:textColor">?android:textColorSecondary</item>
    <item name="textAllCaps">true</item>
</style>

参考にしたサイト様

【Android】 特定のViewのスクリーンショットを共有する

SNSなどへのシェア機能などで、画面のスクリーンショットを共有したかった。
Viewごとでキャプチャできるようなので、その時の備忘録φ(..)メモメモ

View view = ...; // スクリーンショットを取りたいView

// Viewのスクリーンショットを取得
File file = new File(dir, "tmp_image.png");
try (FileOutputStream fos = new FileOutputStream(file, false)) {
    view.setDrawingCacheEnabled(true);      // キャッシュを取得する設定にする
    view.destroyDrawingCache();                  // 既存のキャッシュをクリアする
    Bitmap capture = view.getDrawingCache();

    // 画像のフォーマットと画質と出力先を指定して保存
    capture.compress(Bitmap.CompressFormat.PNG, 100, fos);
    fos.flush();

    view.setDrawingCacheEnabled(false);
} catch (Exception e) {
    file = null;
}

// 共有する処理
ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(activity);
builder.setText("共有するメッセージ");
if (file != null) { // 画像がある場合
    builder.setType("image/png");
    builder.addStream(Uri.fromFile(file));
} else { // 画像がない場合
    builder.setType("text/plain");
}

builder.startChooser();

参考にしたサイト様