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
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
}
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’
というエラーが出ます
androidのEditTextで受け取った数値を扱おうとしてはまった
EditText input = (EditText) this.findViewById(R.id.edittext);
int val = Integer.parseInt(input.toString());