2015年5月29日金曜日

Androidでボタンの色を動的に変更する


Androidでボタンの背景をShapeで作って、その色をコードから動的に変化させるためのメモです。

ボタンをおした時やフォーカスが当たった時の変化に対応しています。




1. 全体のレイアウト


適当にボタンを作っただけです。 android:background=”@drawable/button_background”でボタンの背景を指定しています。


       <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="@dimen/activity_vertical_margin"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            tools:context=".MainActivity">

        <Button
                android:id="@+id/button1"
                android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/button_background"
            android:text="Button1"/>

    </RelativeLayout>

2. ボタンの背景用Shape


ボタンが押されたとき、フォーカスがあるとき、ボタンが押されていないときの順番で定義しています。順番は次の手順で必要になります。


1.で設定したファイル名に合わせて、drawableの直下にbutton_background.xmlというファイル名で作成しています。


初期の色は適当です。それぞれの状態ごとに本体部分の色と枠線の色を定義しています。


<?xml version="1.0" encoding="utf-8"?>
    <selector
        xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- ボタンが押されたときの定義 -->
    <item android:state_pressed="true">
        <shape
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid
                android:color="#0000FF"/>
            <stroke
                android:width="1dp"
                android:color="#00FF00"/>
            <corners
                android:radius="5dp"/>
        </shape>
    </item>

    <!-- フォーカスがあるときの定義 -->
    <item android:state_focused="true">
        <shape
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid
                android:color="#FF0000"/>
            <stroke
                android:width="1dp"
                android:color="#00FF00"/>
            <corners
                android:radius="5dp"/>
        </shape>
    </item>

    <!-- ボタンが押されていないときの定義 -->
    <item android:state_pressed="false">
        <shape
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid
                android:color="#FF0000"/>
            <stroke
                android:width="1dp"
                android:color="#FF0000"/>
            <corners
                android:radius="5dp"/>
            />
        </shape>
    </item>
</selector>

3. ボタンの色を変更するコード


pushedDrawable,focusedDrawable,unselectedDrawableが状態ごとの背景です。Shapeを定義した順番で取得できます。


GradientDrawable.setStroke()で枠線の太さと色を、GradientDrawable.setColor()で本体部分の色を変更しています。


Button button = (Button) findViewById(R.id.button1);
    StateListDrawable background = (StateListDrawable) button.getBackground();
    DrawableContainer.DrawableContainerState containerStateDrawable = (DrawableContainer.DrawableContainerState) background
            .getConstantState();
    Drawable[] children = containerStateDrawable.getChildren();

    GradientDrawable pushedDrawable = (GradientDrawable) children[0];
    GradientDrawable focusedDrawable = (GradientDrawable) children[1];
    GradientDrawable unselectedDrawable = (GradientDrawable) children[2];

    pushedDrawable.setColor(Color.GRAY);
    pushedDrawable.setStroke(10, Color.CYAN);

    focusedDrawable.setColor(Color.CYAN);
    focusedDrawable.setStroke(10,Color.GRAY);

    unselectedDrawable.setColor(Color.MAGENTA);
    unselectedDrawable.setStroke(10, Color.YELLOW);

getBackground()でDrawableを変数に取得して、変数の中身を探すという方法で調べたので、すごく時間がかかりました。


調べ終わってから検索して以下のページを見つけました。全て書いてあります。

How can I change colors in my StateListDrawable? - stackOverflow

http://stackoverflow.com/questions/19864337/how-can-i-change-colors-in-my-statelistdrawable


Written with StackEdit.

2015年3月23日月曜日

RaspberryPi にNode.jsを入れる

参考のページを見ながら、すぐできました。
多少バージョンが古くても手軽に導入するというスタンスです。
ソースからビルドすると、一晩かかるらしいので。

参考にしたページ

Raspberry PiとNode.jsで作る独立稼働モバイルサーバ | Think IT(シンクイット)
RPiにMongoDBをインストール - 落書き以上、技術メモ以下
Emerson’s Site | MongoDB + Raspberry Pi (without building anything!)
svvitale/mongo4pi · GitHub

1. nodebrewnのインストール

$curl -L git.io/nodebrew | perl - setup
$HOME/.nodebrew/current/binにパスを通すように表示されればOK。
.bashrcに上のパスを追加しておく。

2. node.jsのインストール

公式の最新版にはarm用のバイナリがなかったので、少し古いバージョンを選択
$nodebrew install-binary 0.10.28
Install successful
インストール済みのnode.jsのバージョンを確認
$ nodebrew list
v0.10.28
current: none
利用するバージョンをセット
$nodebrew use v0.10.28
use v0.10.28
確認
$node -v
v0.10.28

3.MongoDBのインストール

svvitale/mongo4pi · GitHub
こちらでインストール用のスクリプトを用意してくれているので、gitでもらってきて使います。
$git clone https://github.com/svvitale/mongo4pi.git
$cd mongo4pi
$sudo ./install.sh
完了です。

2015年3月2日月曜日

LinuxMint 17.1で日本語入力

LinuxMint 17.1で日本語入力


追記:2016/7/5
LinuxMint 17.3での日本語入力の設定を書きました。
システム標準の方法で入れています。
アイコンとかも標準のになっているので、こちらのほうが楽に入れられます。



LinuxMint17のときに日本語入力について書いたんですが、そちらにコメントしてくださった方によりますと17.1RCから設定ー>Languagesからインプットメソッドがインストールできるようになっているらしいです。

ということで、そちらの方から入れてみたんですが
 1.パネルに出るアイコンがなんかペンギンみたいなのに変わってる?
 2.そのアイコンをクリックしたときに出るメニューが中国語
 3.mozcをONにしてもアイコンは変わらない
 4.変換候補の出るポップアップがちょっと格好よくなってる

慣れの問題なんでしょうが、自分的には以前の動きと表示が好きだったので、一旦削除して、以前の方法で入れなおしました。

設定->Languageの設定画面からは削除できないようで、パッケージをざっくり削除すると設定画面の方も元に戻っていました。

    $sudo apt-get remove --purge fcitx*

これで削除できます。



AkiIno Blog: Linux Mint 17で日本語入力
http://blog.inoaki.com/2014/07/linux-mint-17.html

LinuxMintのChromium Browserを日本語化する方法

LinuxMintのChromium Browserを日本語化する方法


apt-getで入れたChromiumブラウザのメニューが英語のままで使いにくかったので、日本語化してみました。

というか、前はもっと難しかったような気がしたけれど、いつのまにかパッケージ一個いれるだけでいいみたい。


    $sudo apt-get install chromium-browser-l10n


これだけでOKでした。

2014年12月28日日曜日

Grubをインストールしなおす

Grubをインストールしなおす

WindowsとLinuxをデュアルブートさせていて、WindowsをリカバリーしたりしてGrubが消えてしまったときに、インストールメディアのLiveCD(?)でLinuを起動して、Grubをインストールするという内容。


環境

Linux Mint 17 (Xfce)
Windows7
/dev/sda1にWin, /dev/sda6にLinuxが入っている状態
インストール用のUSBメモリを使用

大まかな手順

  1. USBからブートさせる
  2. HDDのパーティションをマウントする
  3. /proc, /sys, /devディレクトリをHDDにインストール済みのを使うようにする
  4. chrootでHDDの方をルートにする
  5. GrubをHDDにインストールする

細かな手順

  1. USBからブートさせる
     普通にインストール用のUSBからブートさせます。
     ターミナルをひらいて以下の手順を実行。
     
  2. HDDのパーティションをマウントする
      $sudo /dev/sda6 /mnt

    3. /proc, /sys, /devディレクトリをHDDのを使うようにする
       $sudo mount --bind /proc /mnt/proc
       $sudo mount --bind /sys /mnt/sys
       $sudo mount --bind /dev /mnt/dev
 
    4. chrootでHDDの方をルートにする
       $sudo chroot /mnt

    5. GrubをHDDにインストールする
       $sudo update-grub2
       $sudo grub-install /dev/sda