--/--/-- (--) スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 |


2011/11/17 (Thu) 【Android】AlertDialogのカスタマイズ(選択肢を作る場合)

alertdialog.jpg

AlertDialog(アラートダイアログ)を利用して選択肢を作るとこうなります。
左が「setSingleChoiceItems」、右が「setItems」で中身を追加しています。
ただし、このままだと選択項目の幅や文字サイズ、文字の色などを変更することは出来ません。

20111117-205858.jpg

カスタムビューを使わずにこのようにカスタマイズしたいと思います。
「setSingleChoiceItems」の第一引数にListAdapterを設定できることを利用し、
ListAdapterに表示するレイアウトを作り、レイアウトファイルで文字サイズや文字色を指定します。



【Java】

ArrayAdapter<String> adapter = new ArrayAdapter<String>(
Context context , R.layout.simple_original_list_item,
String[] Objects(選択項目の配列));

  new AlertDialog.Builder(Context context)
.setTitle( "タイトル" )
.setIcon( アイコン画像 )
.setSingleChoiceItems(adapter, デフォルト値(0~),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int i) {

                                        //選択項目が押された際の処理
                                        //(例えば選択項目配列[i]で選択文字列が手に入る)


dialog.dismiss();
}
}).show();


【xml】 res/layout/simple_original_list_item.xmt

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="17sp"
    android:textColor="@android:color/background_dark"
    android:gravity="center_vertical"
    android:padding="10dip"
/>



スポンサーサイト

プログラミング | trackback(0) | comment(0) |


2011/11/10 (Thu) Androidプログラミング5 画像編集「モノクロフィルタのソースコード」

 前回紹介したノイジーなモノクロフィルタのソースコード。撮影したBitmapを引数で受け取り変換したBitmapを戻すメソッドです。変換処理は、例えばVGA(640x480)サイズの写真の場合、1ピクセルずつカラーデータを取り出し、そのデータを書き換えて写真に戻すという作業を約31万回繰り返します。今回はARGB_8888というフルカラーのデータとして扱っていますが、メモリ不足になる場合はRGB_565などでも問題ないと思います。

 ARGB_8888とは、左から透明度(Α)、赤(R)、緑(G)、青(B)で各8ビット(256段階)の色データを持つ形式です。白を黒に変換するというフィルタの場合、ARGB(255,255,255,255)をARGB(255,0,0,0)に置き換えることになります。

ソースの解説

①通常のBitmapは編集が不可能なため、Bitmapをコピーしてmutable(編集可能)なBitmapを生成します。ここで一時的にメモリ上にビットマップが2枚存在することになるため、解像度の大きな画像を使うとOut of Memory Errorで落ちます。例外ではなくエラーなので回避処理が存在せず、現状フィルタ処理をサービスでプロセスを分け、エラーになってもメインのアクティビティが巻き込まれないようにしています。

②Bitmapの色データをint配列にまとめて読み込みます。getPixel()メソッド、setPixel()メソッドで1ループごとに色の置換をしていっても良いのですが、処理にかかる時間が長くなるためまとめて取得しまとめて配置するようにしています。

③RGBからグレースケールを求める計算式はいくつかありますが、ここではもっともシンプルなRGBの総和を3で割った数値をRGBに入れる方法を採っています。

④コントラストの計算式です。1.9の部分を変更することでコントラストが変化します。ここではかなり強めにしています。

⑤ノイズを載せるためにランダムで色を変化させます。

⑥このフィルタでは乗算しかしていないのでこのif文は不要ですが、RGBの値が「0-255」の範囲外になると色が反転してしまうので、はみ出した部分に対する処理が必要になることがあります。

  public static Bitmap monoChrome(Bitmap bitmap, Random rnd) {

Bitmap editBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); ・・・①
int width = editBitmap.getWidth();
int height = editBitmap.getHeight();
int pixels[] = new int[width * height];
int red, green, blue, gray, ran, pixel;
editBitmap.getPixels(pixels, 0, width, 0, 0, width, height); ・・・②

for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
pixel = pixels[x + y * width];
red = Color.red(pixel);
green = Color.green(pixel);
blue = Color.blue(pixel);
gray = (red + green + blue) / 3;

// 輝度を求める公式
// gray = (77 * red + 28 * green + 151 * blue) / 256; ・・・③

gray = (int) ((gray - 128) * 1.9 + 128); ・・・④

if (gray > 225) {
gray *= 0.8;
} else if (gray < 30) {
gray *= 1.2;
}
if (gray > 255) {
gray = 255;
} else if (gray < 255) {
ran = rnd.nextInt(6); ・・・⑤
if (ran == 1) {
gray *= 0.96;
} else if (ran == 2) {
gray *= 0.92;
} else if (gray < 220 && ran == 3) {
gray *= 0.96;
} else if (gray < 220 && ran == 4) {
gray *= 0.92;
} else if (gray < 180 && ran == 5) {
gray *= 0.96;
} else if (gray < 180 && ran == 6) {
gray *= 0.92;
}
if (gray < 0)
gray = 0; ・・・⑥
}
pixels[x + y * width] = Color.rgb(gray, gray, gray);
}
}
editBitmap.setPixels(pixels, 0, width, 0, 0, width, height); ・・・②
return editBitmap;
}

プログラミング | trackback(0) | comment(0) |


2011/10/26 (Wed) 【予約投稿】Androidプログラミング カメラアプリ制作中(5) フィルター作り

dynamicmonochrome.jpg

 
 カメラの基本的な部分のプログラミングが終了し念願だったフィルタ制作に入りました。今回紹介するフィルタはOLYMPUSのラフモノクロームを意識したものです。左がカメラの機能として搭載されているノーマルのモノクロ。右が独自フィルタを使ったモノクロ。コントラストを高めつつ、暗い部分のピクセルをランダムでより暗くなるようにして粒子感(ノイズ)を出しています。このフィルタではユーザーが粒子感の度合いを調整できるようになっています。リサイズした画像ではよく分からないかと思うので、実機からキャプチャしたスクリーンショット(PNG)を置いておきます。

 実際のコードの中身は次回の記事で紹介する予定です。

キャプチャ画像(フィルタ適用前)
キャプチャ画像(フィルタ適用後)

プログラミング | trackback(0) | comment(0) |


2011/10/19 (Wed) Androidプログラミング カメラアプリ制作中(4) 設定画面の改良

20111019-005034.jpg

After
「ExpandableListView」(入れ子型のリストビュー)を使用。「default」の場所には選択された項目が入る予定(なんだけど今のところ上手くいっていないTT)。表示される内容は端末によって異なる(詳しくは過去記事)。設定された項目はプレファレンスを利用して保存する。画質は大まかな設定値とシークバーによる100段階の設定が可能。子項目が選択されると展開されたていたリストは閉じる。下部の「Accept」と「Cancel」のテキストビューは「○」と「×」に変更する予定(←ライセンスフリーのシンボルフォントを物色中)。

20111019-005106.jpg

Before
「Spinner」を利用。実装は楽だけれど見た目が野暮ったい(あくまで主観)。選択項目がそのままカメラへ渡す引数となるため、説明文などを入れる余地が無く分かり難い。

プログラミング | trackback(0) | comment(0) |


2011/10/14 (Fri) Androidプログラミング カメラアプリ制作中(3)

20111014-101225.jpg

 先日のISO感度設定が出来ないという問題点はこちらのサイトのおかげで無事解決。読み込むときの引数(キー)が「"iso-values"」(端末がサポートしているISO感度のセット)になっていて、値をセットするときの引数も同じだと勘違いしてたけど「"iso"」になるらしい。下の写真の左上がISO100、その右がISO3200で撮影したもの。ノイズの乗り具合を見るとちゃんと反映されてる様子。

 そして昨日はカメラアプリに統合するフォトビューアソフトを作った。といっても、現時点ではカメラが写真を保存するフォルダの画像を読み込みGridViewにサムネイル表示して、サムネイルをタッチするとIntentのExtraで写真パスを送り、受け取った画像表示用ActivityのImageViewへ全画面表示されるというだけの仕様。工夫した点は縦長や横長の写真であってもサムネイルを正方形表示させるところ。サムネイルを作る独自アダプタクラスの中で画像の縦と横の長さを見て、長い方を短い方にあわせてトリミングする。詳しいコードは「続きを読む」から。

【課題】ただこのGridViewで表示させる方法は、フォルダ内の画像が多くなると読み込み結果がおかしくなるので改善の余地あり。500枚近く保存してるCamera360用の画像フォルダで試したところ20枚近くを読み込んだ時点で500枚分のGridViewが表示されて、その30枚がループして表示されてしまった。現状では全てのサムネイルを作成してから表示させるため、そのサムネイルを保存する一時保存領域がパンクしてしまった感じ。解決策として、読み込みをサービスに投げる方法を模索中。

...続きを読む

プログラミング | trackback(0) | comment(0) |


| TOP | next >>

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。