Android SDK TextViewを「あいうえおかき…」と省略して1行にまとめる

Share on Facebook
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip

android:scrollHorizontallyをtrueにしろ、android:linesを1にしろ、android:maxLinesを1にしろ、そして、android:ellipsizeを設定しろ、とネット上にいろいろと情報がありますが、なぜか僕の環境だと「…」を表示してくれませんでした。
その解決方法がわかったのでメモ。

<TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="@drawable/menu_right_text" />

このように、singleLineとellipsizeを設定したらいけました。
ちなみに、ellipsizeには以下の設定ができます。

例:あいうえおかきくけこ

指定値 デフォルト 動作
none 何もしない
start …おかきくけこ
middle あいう…くけこ
end あいうえおか…

Android SDK Bitmapをあらかじめ縮小してから読み込む(OutOfMemory対策)

Share on Facebook
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip

今の端末だと10Mピクセルを越えるカメラを搭載した端末が普通になってきており、そのファイルサイズも数MBに及びます。
AndroidでBitmapFactoryを利用してフォトライブラリーから画像を読み込んだりすると思いますが、そのままその画像を読み込んでしまうと、しばしばOutOfMemoryとなりアプリが強制終了してしまいます。
そこで、実際に画像を読み込む前にある程度縮小してから読み込むことで、メモリが足りなくなることを防ごうというのが今回のネタです。

BitmapFactory.OptionsのinSampleSizeを指定して画像を縮小した状態で読み込む

処理の流れ的にはまず画像のサイズを取得して、サイズが大きかったら縮小指定してから読み込もう、という感じです。

InputStream inputStream = getContentResolver().openInputStream(data.getData());

// 画像サイズ情報を取得する
BitmapFactory.Options imageOptions = new BitmapFactory.Options();
imageOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(inputStream, null, imageOptions);
Log.v("image", "Original Image Size: " + imageOptions.outWidth + " x " + imageOptions.outHeight);

inputStream.close();

// もし、画像が大きかったら縮小して読み込む
//  今回はimageSizeMaxの大きさに合わせる
Bitmap bitmap;
int imageSizeMax = 500;
inputStream = getContentResolver().openInputStream(data.getData());
float imageScaleWidth = (float)imageOptions.outWidth / imageSizeMax;
float imageScaleHeight = (float)imageOptions.outHeight / imageSizeMax;

// もしも、縮小できるサイズならば、縮小して読み込む
if (imageScaleWidth > 2 && imageScaleHeight > 2) {	
	BitmapFactory.Options imageOptions2 = new BitmapFactory.Options();

	// 縦横、小さい方に縮小するスケールを合わせる
	int imageScale = (int)Math.floor((imageScaleWidth > imageScaleHeight ? imageScaleHeight : imageScaleWidth));	

	// inSampleSizeには2のべき上が入るべきなので、imageScaleに最も近く、かつそれ以下の2のべき上の数を探す
	for (int i = 2; i < imageScale; i *= 2) {
		imageOptions2.inSampleSize = i;
	}

	bitmap = BitmapFactory.decodeStream(iStream, null, imageOptions2);
	Log.v("image", "Sample Size: 1/" + imageOptions2.inSampleSize);
} else {
	bitmap = BitmapFactory.decodeStream(inputStream);
}

inputStream.close();

BitmapFactory.OptionsのinSampleSizeに2のべき上を入れ、それを指定して画像を読み込むことで、2のべき上で縮小された画像を読み込むことができます。
たとえば、inSampleSize=2であれば、 1/2に縮小された画像が、inSampleSize=4であれば、1/4に縮小された画像が読み込まれます。
inSampleSizeには2,4,8,16と2のべき上を入れます。

読み込む画像の階調を指定して読み込む

読み込む際の画像サイズの縮小は解像度だけでなく、階調を変えることでサイズを落とすこともできます。

BitmapFactory.Options imageOptions = new BitmapFactory.Options();
imageOptions.options.inPreferredConfig = Bitmap.Config.ARGB_8888;

設定できる階調は以下です。

  • ARGB_8888:alpha/R/G/B 各8bit ー 8*4 = 32bit = 4byte / pixel
  • ARGB_4444:alpha/R/G/B 各4bit ー 4*4 = 16bit = 2byte / pixel
  • RGB_565:R(5bit)/G(6)/B(5) ー 5+6+5 = 16bit = 2byte / pixel
  • ALPHA_8:αのみを8bit ー 8bit = 1byte / pixel

体感的にはアルファー値の無い写真などは、RGB_565とかはそこまで劣化が気にならない程度でサイズが半分になるのでおすすめです。

まとめ

画像取得系はメモリを消費して大きい画像を取得するとすぐにOutOfMemoryで落ちるので、読み込む前にサイズを小さくしよう!

KeyRemap4MacBookでControl+hjklをカーソル移動に設定して快適コーディング

Share on Facebook
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip

みなさん、プログラミングをするときや、ブログの文章、レポート、はたまたKobitoでQiita向けにTipsを書いているとき、カーソルの移動ってどうしていますか?
僕は、例えばXcodeやeclipseでコーディングするときはキーバインドの設定を変更してCtrl+hjklをカーソル移動に割り当てています。
これで、わざわざカーソルキーに手を移動しなくても、ホームポジションに手を置いたままカーソル移動ができるわけです。
このようなキーバインドの設定をXcodeやeclipse、Sublime Textなどエディタごとにいちいち設定していたのですが、もうこれならシステム全体でCtrl+hjklをカーソル移動に割り当ててしまおうと。
そうすると、わざわざ設定する手間が省けるばかりか、ブログの文章を書いているときなど、ブラウザからテキストを編集しているときや、そもそもキーバインド設定が出来ないエディタを使ったときでもこの設定を使うことができます!
では、さっそく。


KeyRemap4MacBookをインストール


KeyRemap4MacBook – OS X用のソフトウェア
公式ページからKeyRemap4MacBook をダウンロード、インストールしましょう。


Control+hjklをカーソル移動に設定する


スクリーンショット 2013-06-13 12.50.31.png


KeyRemap4MacBookを起動し、


  • Vi Mode → Control_L+hjkl to Left/Down/Up/Right

をクリックしてください。
これで終わりです!


Macのcaps lockキーをControlキーにしよう


番外編として。


スクリーンショット 2013-06-13 12.12.23.png


MacのUSキーボードでは非常に打ちやすい位置に、一番使用することがない、いや、むしろ誤動作の原因になるcaps lockキーが配置されています。
これを、Controlキーに変更することで、今回設定したControl+hjklカーソル移動がより快適になります。


スクリーンショット 2013-06-13 12.31.39.png


  • システム環境設定 → キーボード → 修飾キー

ここから変更することができます。


まとめ


デフォルトの設定は結構クソなのでいろいろいじろう!

SublimeText Control+hjklでカーソル移動

Share on Facebook
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip

スクリーンショット 2013-06-13 12.12.23.png


僕はMacのUSキーボードでcaps lockキーをControlキーに割り当てなおして運用しています。
一番小指で押しやすいキーがなんでcaps lockなんだよ、という感じですが、これをControlなどに変更するとコーディングが劇的に快適になって、例えば、今回のネタのようにカーソル移動のキーバインドをControl+hjklなどに設定するといい感じになります。
ということで、Sublime Text 2において、Control+hjklを使ったカーソル移動を実現するためのキーバインド設定ネタです。


キーバインドを変更する


Sublime Text 2 → Preferences → Key Bindings – User
と選択すると、キーバインドを設定するための設定ファイルがエディタ上に表示されます。そのファイルに以下の設定テキストを挿入して保存してください。


[
{ "keys": ["ctrl+l"], "command": "move", "args": {"by": "characters", "forward": true } },
{ "keys": ["ctrl+h"], "command": "move", "args": {"by": "characters", "forward": false } },
{ "keys": ["ctrl+j"], "command": "move", "args": {"by": "lines", "forward": false } },
{ "keys": ["ctrl+k"], "command": "move", "args": {"by": "lines", "forward": true } }
]


設定は以上です。


Macのcaps lockキーを無効化し、別のキーに設定する


スクリーンショット 2013-06-13 12.31.39.png


システム環境設定 → キーボード → 修飾キー
ここから変更することができます。

【 #iPhoneAppMemo 】電卓のように数字を3ケタずつカンマで区切ったNSStringを作る

Share on Facebook
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip

スクリーンショット 2013-06-12 14.52.24.png

電卓アプリとか、数字を入力したり、金額を入力したりする場合は、例えば「1,280」のように三桁ずづカンマで区切ったNSStringを生成して、UILabel等に表示したい場合があります。
その簡単なやりかたとか。

- (NSString *)createStringAddedCommaFromInt:(int)number
{
	NSNumberFormatter *format = [[NSNumberFormatter alloc] init];
	[format setNumberStyle:NSNumberFormatterDecimalStyle];
	[format setGroupingSeparator:@","];
	[format setGroupingSize:3];
	
	return [format stringForObjectValue:[NSNumber numberWithInt:number]];
}

この関数にint型の数字を送ると3桁ずつカンマで区切ったNSStringを生成してくれます。
桁数が大きくなる場合はlong型とかにしてもいいかもしれません。