2011年9月 8日

「BPM for android」公開しました!

BPM for android


ビートに合わせてボタンをタップすると曲のテンポがわかる、androidデバイス用のタップテンポアプリを公開しました。
もともと、iPhone用に作っていた、「BPM」のandroid版です。

でも、現在演奏中の曲の情報を取得するのが難しかったので(曲を演奏するアプリがいろいろありすぎて、対応が面倒すぎる......)、その機能はカットして、シンプルなタップテンポアプリになっています。
無料で公開してるので(広告が出ますが)ぜひ使ってみてくださいませ。

ダウンロードはこちら
BPM for android - Android マーケット

投稿者 CHEEBOW : 13:51 | [ android ]

2011年6月 2日

Javaのイベントリスナをどう書く?

androidのアプリ開発をしてると、画面のUI部品のイベントを受け取るイベントリスナを書くことになるわけですが、これ、書き方によっては、やたらonCreateメソッドが長くなっちゃっていやだーなと思っていたのです。

で、調べてみたら、

blog lesson 01 - Javaのイベントリスナの書き方についての考察

こんなエントリを見つけました。
でも、どれもonCreateの中に書いてあって、やっぱ、そういうもんなのかなーと思ったりもしたのですが、Facebookで友人に教えてもらいつつ、外側に出す方法を考えてみました。

private OnClickListener myListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // ボタンクリックの処理
    }
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 
    findViewById(R.id.button1).setOnClickListener(myListener);
    findViewById(R.id.button2).setOnClickListener(myListener);
    findViewById(R.id.button3).setOnClickListener(myListener);
}

まず、変数自体をonCreateの外に出しちゃう。
すっきりする!!

private class MyOnClickListener implements OnClickListener {
    @Override
    public void onClick(View v) {
        // ボタンクリックの処理
    }
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 
    findViewById(R.id.button1).setOnClickListener(new MyOnClickListener());
}

これは、それぞれのリスナをクラスとして定義しちゃう。
個々のイベントを扱うクラスがたくさんできちゃうけど、メンテナンス性は良さそう。

Javaだとこういうときどう書いたらいいのかわからないの......。
どこかにベストプラクティス的なものありませんかねぇ。

投稿者 CHEEBOW : 16:52 | [ android ]

2011年5月12日

android版「コトバトコ」できました

「コトバトコ」のandroid版ができました!

「コトバトコ」は、こんな感じで、言葉の意外な組み合わせを楽しむiPhoneアプリでしたが、今回android版を開発し、Androidマーケットで公開しました。

コトバトコ - Android マーケット

まだ、コトバトコの世界を知らない人も、ぜひ楽しんでみてください。

iPhoneユーザさんは、こちらから!

コトバトコ

投稿者 CHEEBOW : 11:43 | [ android ]

2011年4月 7日

Xperia arcでスクロール時にViewが拡大されてしまう問題

Xperia arcで実機デバッグしながら開発をしている今日この頃なのですが、ListViewとかGridViewを使うと、スクロールしたときにViewが拡大されてしまうという怪現象にぶち当たりました。
うーんうーんと悩んでいたのですけど、先ほど解決策を見つけました。

ヒントになったのは、このスレッド。

初回起動時にViewサイズが大きく表示される - 日本Androidの会 | Google グループ

minSdkVersionを指定しないと、デフォルトでAndroid1.0になるとのこと。
SDKのレベルかつ機種によって、dip指定の表示処理が正常に動作しなかったのかと。
(各オブジェクトをpx指定してやると症状は発生しなかったので)
Xperia arcに関しては何かしらのイベントを通るとレイアウトが正常に設定される感じでした。

さっそく、自分のプロジェクトで minSdkVersionを指定するようにしたら!
直った!!

ここしばらく、ずっと引っかかっていたので、すっきりしました!
日本Androidの会さま、ありがとうございます!!

これからは、 minSdkVersionを必ず指定するようにしたいと思います!!

投稿者 CHEEBOW : 19:03 | [ android ]

2011年2月16日

andoridでサムネイル画像を正しい向きで表示する

最近androidの開発はじめました。
iOSとは違うところが多くて、あちこちで躓いていますがなんとか元気です。

で、ちょっとSDカードに保存されている画像の一覧をGalleryウィジェットに表示しようと思いまして。
コンテンツプロバイダ経由で、サムネイルを表示しようと思ったわけなんですが、これが、なんか、撮った写真の向きとは違うサムネイルが表示されちゃうわけですよ。
うまい方法ないかなーと探してたんだけど、なかなか見つからず、必死でひねり出してみました。

で、こんな感じのアダプターを作ってみたのです。

    public class ImageAdapter extends BaseAdapter {
        Context context;
        Cursor curusor;
        ContentResolver cr;
        public ImageAdapter(Context c) {
            context = c;
            cr = getContentResolver();                  
            Uri uri = MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI;  
            curusor = cr.query(uri, null, null, null, null); 
      
            curusor.moveToFirst();  

        }
        public int getCount() {
            return curusor.getCount();
        }
        public Object getItem(int position) {
            return position;
        }
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = (ImageView)convertView;
              if (i == null) {                                        
                 i = new ImageView(context);
                 try {
                     curusor.moveToPosition(position);  

                     long image_id = curusor.getLong(curusor.getColumnIndexOrThrow("image_id"));
                     
                     Bitmap obm = MediaStore.Images.Thumbnails.getThumbnail(
                             cr, 
                             image_id,
                             MediaStore.Images.Thumbnails.MICRO_KIND,
                             null);
                     
                     Uri uri = ContentUris.withAppendedId(
                             MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                             image_id); 
                     Cursor c = cr.query(uri,
                                new String[] { MediaStore.Images.ImageColumns.ORIENTATION },
                                null, null, null);
                     c.moveToFirst();
                     int orientation = c.getInt(0);
                            
                     int width = obm.getWidth();  
                     int height = obm.getHeight();  

                     Matrix matrix = new Matrix();
                     
                     Bitmap bm;
                     if (orientation == 0) {
                         bm = obm;
                     } else {
                         matrix.postRotate(orientation);  
                         bm = Bitmap.createBitmap(obm, 0, 0, width, height, matrix, true);  
                     }
                     
                     i.setImageBitmap(bm);
                     i.setScaleType(ImageView.ScaleType.FIT_XY);
                 } catch (Exception e) { 
                 } 
              }
              return i;
        } 
    } 

サムネイルを取得するときに、元の画像のorientationを取得してそれに合わせてサムネイルを回転させるという寸法。
サムネイル自身に、orientation情報があればよかったのだけど、なんか、見つからなかった。これが取れちゃえば一発なんだけども。
でも、なんかもっとうまい解決方法があるような気もする......。

で、こんな感じに使うとギャラリーにサムネイルが表示されるよーって感じ。

        Gallery g = (Gallery) findViewById(R.id.Gallery01);
        g.setAdapter(new ImageAdapter(this));  

いやいや、違うよ! とか、もっと良い方法あるよ! とか教えてもらえるとうれしいですー。

投稿者 CHEEBOW : 16:03 | [ android ]