俺得カラーピッカーライブラリ化しました

先日ソースごと公開した俺得カラーピッカーですが、@zaki50さんと@kazzzさんの助言により俺得カラーピッカーをライブラリ化しました。またライブラリ化にあたりバグ回避のため、ちょこっとソースを変えています。

(読み飛ばしてもらってもかまわないが書かずにいられないすばらしき)経緯

ライブラリ化にあたってうまくいかないので、ウンウン悩んでました。@akai_tさんにも確認してもらっておかしいなと。すると@t_eggさんにカスタムViewでカスタム属性使ってる場合に名前空間の解決ができないというバグがある(Issue 9656)と教えてもらいました。

その後、このやりとりをtwitterで見かけた@keiji_ariyamaさんがこのバグに対してPatchSetを送ってくださいました(現在レビュー中)。何このすばらしきAndroidデベロッパー野郎どもの連携プレイ。尊敬します。こいつらまぶしすぎるぜ…!(ありがとうございます)

使い方について

EclipseSubversive前提です。他のSubversionプラグインを使ってる方もだいたい同じ手順でできると思います。

ライブラリプロジェクトの取り込み

1. SVNからライブラリプロジェクトを作成。[New]-[Other…]を選択し、[SVN]-[Project From SVN]を選択し[Next>]をクリック。

2. 以下のURLを入力し[Next>]をクリック

http://superdry-colorpicker.googlecode.com/svn/trunk/SuperdryColorPickerLib

3.以下の画面になるので[Finish]をクリック

4.プロジェクトのプロパティを開き「isLibrary」にチェックが入ってることを確認。

アプリへのライブラリからの参照設定

1.取り込みたいAndroidアプリのプロジェクトのプロパティを開き、[add]をクリック。

2.SuperdryColorPickerLibを選択し、[OK]をクリック。

実装

1. 下記のコードでIntent投げる。initialColorは色の初期値の変数となっている(0xffffffffなどのint型)。

    Intent intent = new Intent(this, org.superdry.util.colorpicker.SuperdryColorPicker.class);
    intent.putExtra("SelectedColor", initialColor);
    startActivityForResult(intent, ACTION_GETCOLOR);

2. 返ってきたIntentにSelectedColorという名前で選択した値(0xffffffffのようなint型)が返ってくるので、下記のように取得。

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == ACTION_GETCOLOR) {
                if (resultCode == RESULT_OK) {
                        Bundle b = intent.getExtras();
                        if (b != null) {
                                changedColor = b.getInt("SelectedColor");
                        }
                } else if (resultCode == RESULT_CANCELED) {
                        changedColor = initColor;
                }
                mPaint.setColor(changedColor);
                color.setBackgroundColor(changedColor);
        }
}

3. AndroidManifest.xmlに以下を追加してください。特に(2)の登録はこの定義前提でColorPickerはレイアウトしてますんで、登録忘れちゃうとレイアウト崩れます。
 (1) タグの下にライブラリのActivityの登録(開くときのStyleはダイアログで)

	<activity android:name="org.superdry.util.colorpicker.lib.SuperdryColorPicker"
			android:theme="@android:style/Theme.Dialog" />

 (2) タグの下にサポートする画面密度とサイズの対応の定義を追加。(フルサポート)

	<supports-screens android:smallScreens="true"
		android:normalScreens="true" android:largeScreens="true"
		android:anyDensity="true" />
その他

ドット密度ごとにレイアウトファイルを用意してます(colorpickerlayout.xml)。独自でレイアウト作成したい場合は、このあたりいじってください。円形のグラデーションパレットと明度を選択できるスライダーは一つのカスタムViewになっています。


以上です。