Archive

Posts Tagged ‘java’

画像の向き(Orientation)を取得

January 3rd, 2011 No comments

Androidのカメラは横(Landscape)表示が標準らしく、縦画像が撮れないアプリもあったりします(Milestone2の標準カメラは駄目でした)
ここでいう縦画像は width < height な画像のことで、普通に表示すると縦長になる画像のことです
しかし、Milestone2のギャラリーでは端末を縦にして撮影したときの画像は縦長で表示されます
PCに取り込むと横長になってしまうのに何故?と思ったらExifにOrientationが書きこまれていました!
ということは、この値を見て向きを判別できるということですね
AndroidではいちいちExifを見なくてもある程度の情報はMediaStoreから取得出来ます

前置きが長くなりましたがサンプルコードです
Intent.ACTION_SEND で画像を受け取った場合を想定しています

Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
ContentResolver cr = getContentResolver();
Cursor query = MediaStore.Images.Media.query(cr, uri,
    new String[] { MediaStore.Images.ImageColumns.ORIENTATION },
    null, null);
query.moveToFirst();
int orientation = query.getInt(0);

orientation は整数で、0, 90, 180, 270 の値を取ります
あとはこの値になるように Matrix#postRotate(orientation) なんかで画像を回転させれば正しい向きの画像データが得られます

以上を踏まえて画像縮小アプリを作りました
yusukezzz/ImageReducer - GitHub

Tags: ,

ListActivityでタッチしても反応しない

September 15th, 2010 No comments

List表示しているTextViewをタッチしても反応がないのでプロパティをよく見てみたら、いつの間にか
Clickable true
になっていました
どうやらこれがtrueだとタッチ操作が取れなくなるようです
これをfalseにしても何故かクリックに反応しました
というか、多分自分がクリックのイベントについて理解してないせいだと思いますが

ListActivityのタッチ・クリックイベントはどちらも以下のメソッドをオーバーライドして取得します

@Override
protected void onListItemClick(Listview l, View v, int pos, long id) {
    super.onListItemClick(l, v, pos, id);
    // do something
}
Tags: ,

ListActivityの使い方

September 12th, 2010 No comments

Androidでリスト表示する際のレイアウトについて
ListViewを持つレイアウトを作り、ListViewのIDを @+id/android:list にしておきます(固定値)
ListActivityを継承したActivityでそのレイアウトをsetContentViewします
そしてAdapterを適当に自作してsetListAdapterします

コードとしてはこんな感じ

public class MyList extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylist);

        // 適当にリストに登録するデータを用意
        // 実際にはXMLファイルなどから読み出してセットする
        List<MyListItem> items = new ArrayList<MyListItem>();
        for (int i=0; i<3; i++) {
            items.add(new MyListItem("hoge" + i));
        }

        // 自作Adapterにデータをセットする
        MyAdapter adapter = new MyAdapter(this, R.layout.mylist_row, items);
        setListAdapter(adapter);
    }
    public class MyListItem {
        private String value;
        public MyListItem(String val) {
            this.value = val;
        }
        public String getString() {
            return this.value;
        }
    }
    public class MyAdapter extends ArrayAdapter<MyListItem> {
        private List<MyListItem> items;
        private LayoutInflater     inflater;

        public MyAdapter(Context context, int resourceId,
                List<MyListItem> items) {
            super(context, resourceId, items);
            this.items = items;
            this.inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;
            if (view == null) {
                // 1行分のviewを生成
                view = inflater.inflate(R.layout.mylist_row, null);
            }
            MyListItem item = items.get(position);
            TextView textView = (TextView) view
                    .findViewById(R.id.mylist_row_string);
            textView.setText(item.getString());
            return view;
        }
    }
}

レイアウト R.layout.mylist_row は mylist_row_string というIDのTextViewを1個持っているとします

注意点としてはListViewのIDを @+id/android:list にすること、これを忘れると
java.lang.RuntimeException: Your content must have a ListView whose id attribute is ‘android.R.id.list’
というエラーが出ます

Tags: ,

java: stringをintにキャストする方法

August 29th, 2010 No comments

androidのEditTextで受け取った数値を扱おうとしてはまった

EditText input = (EditText) this.findViewById(R.id.edittext);
int val = Integer.parseInt(input.toString());
Tags: ,