2011年4月26日火曜日

【Android】 ドラムピッカーを作りました。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
作りました。
とりあえずDatePickerとTimePickerです。
まだサイズとか決め打ちっぽいのでレイアウト的に微妙です。
レイアウトxmlで適当に配置するとたまに死にます。
見た感じは↓



仕組み


DrumPickerというクラスをつくって、そこに任意の文字列コレクションと幅を指定すると列を一個作るみたいな感じになっています。
内部的にはScrollViewとLinearLayoutを組み合わせてドラム部分を作っています。
影はShade,レンズ部分はアルファ値を適当に指定して色を重ねあわせてる感じです。

例えばTimePickerは24時間,60分の文字列を突っ込んで、リスナーとかで時間の変更を貰っていろいろあれしています。
TimePickerは60行くらいで出来たので、まぁまぁ拡張性があるのか、何なのか。DatePickerの方は泥沼で195行。やっぱダメだ。
表示周りはリソースを使わず全てコード上でやっているので、jar形式かなんかで配布可能です。

今後


GitHubでソースを公開してます。まだ実用性は薄いかもなぁと。
https://github.com/sys1yagi/AndroidPractice/tree/master/DrumPicker/trunk

サンプル

サンプル実装をAndroid Marketに公開しました。
使い心地とかバグとか感想いただけるとありがたいです。
https://market.android.com/details?id=jp.dip.sys1.android.drumpicker&feature=search_result

9 件のコメント:

  1. いつも勉強させて頂いています。
    こちらのドラムピッカー自体のheightを大きくするにはどこをいじればいいのでしょうか。
    もしよろしければよろしくお願いします。

    返信削除
  2. 素晴らしいです
    ソースコードのライセンスに関してはどのようにお考えでしょうか?

    返信削除
  3. こんにちは。

    上の匿名さん:
    DrumPicker.javaの93行目で決め打ちで書いています。この辺りはいずれ修正したいですねー

    下の匿名さん:
    そういえばライセンスについて明記していませんでした。MIT Licenseです。何に利用していただいても構いません。

    返信削除
  4. >yagi様
    早急なご回答ありがとうございます
    早速ライブラリ化して利用させてもらいます

    返信削除
  5. yagi様
    とても素晴らしいサンプルです。
    参考にさせて頂いております。ありがとうございます。
    一点、もし可能であればご教授して頂きたいです。
    ピッカーのスクロール(onScrollChanged?)ですが、
    スクロール直前に位置によって、早いスピードでスクロールを実施すると
    onPositionChangedイベントが発生されないです。
    例:分列にて操作
    現在位置 1分又は2分 -> 0分方向(下)に早くスクロールする。
    このときスクロール自体はされますが、イベントが発生されないのです。
    軽くスクロールをするとイベントは発生します。
    この点に関しては改善もしくは変更可能ですしょうか。
    宜しくお願い致します。

    返信削除
  6. あなたは素晴らしい仕事をしました。

    返信削除
  7. はじめまして、いろいろと勉強させてもらっています。
    DrumPickerを触らせてもらい感動しました。
    サンプルをもとに勉強中です。

    そこで一点質問させてください。
    ドラムをループさせることは可能でしょうか?

    よろしくお願いいします。

    返信削除
  8. はじめまして、DrumPickerを使わせて頂いてます。
    ドラムをAlertDialog等に設置した上で、
    AlertDialog上にあるドラムを思いきりスクロールさせ、
    ドラムが止まる前にAlertDialogを閉じた場合に、
    ドラムの位置が、移動前の位置を報告します。

    スクロール途中の現在位置を取得する、良い方法は存在するでしょうか?

    返信削除
  9. はじめまして。
    ピッカーのカスタマイズを検索に検索を重ね、こちらにたどりつきました。
    現在、年月日、時分で2行の表示になっていますが、
    年月日時分を1行で表示したいと思っています。

    各ピッカーの幅は変更ができたのですが、一行で表示する、レンズを併せる部分に四苦八苦しております。どう対応したらよいのかご教示いただけないでしょうか?

    返信削除