naoponです!
前回に引き続き、コードで動的なselectorのdrawableを生成する時パート2です。
今回は「StateListDrawable」,「BitmapDrawable」なるクラスを使用するのですが、
ポイントは画像にフィルターをかけるところかな?と思います。
やろうとしていることは、
1つのアイコンから、押されている時、押されていない時でアイコンの色が変わるセレクターを動的に!!
以下、コードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
// Bitmap Selector // 画像用にDrawableを生成する private StateListDrawable createSelecterBitmapDrawable(Resources, res, int drawableId, int color, int alpha) { //ベース Bitmap one = BitmapFactory.decodeResource(res, drawableId); //セレクター用 Bitmap normalBitmap; { normalBitmap = Bitmap.createBitmap(one.getWidth(), one.getHeight(), Config.ARGB_8888); Canvas c = new Canvas(normalBitmap); Paint p = new Paint(); p.setAlpha(mAlpha); p.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)); c.drawBitmap(one, 0, 0, p); } Bitmap highlightBitmap; { highlightBitmap = Bitmap.createBitmap(one.getWidth(), one.getHeight(), Config.ARGB_8888); Canvas c = new Canvas(highlightBitmap); Paint p = new Paint(); p.setAlpha(mAlpha); p.setColorFilter(new PorterDuffColorFilter(colorDarker(color, 0.8f), PorterDuff.Mode.SRC_IN)); c.drawBitmap(one, 0, 0, p); } Drawable normal = new BitmapDrawable(res, normalBitmap); Drawable highlight = new BitmapDrawable(res, highlightBitmap); //Seletor生成 StateListDrawable states = new StateListDrawable(); states.addState(new int[] {-android.R.attr.state_pressed}, normal); states.addState(new int[] {android.R.attr.state_pressed}, highlight); //※ Bitmapのリサイクル処理はちゃんとしてね //今回はコードが複雑になるので省きます //Drawable return states; } // こんな感じに // ImageButton(ImageView)の画像にセットする imgbtn.setImageDrawable( createSelecterBitmapDrawable( getResources(), R.drawable.icon, 0xFFFFFF, 255) ); |
アイコンの色は、ベースのBitmapから新規にBitmapを生成して、
Paintで.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
でフィルターをかけることで色を変えています。
それをハイライト分も作ったあとに、
セレクター用にBitmapDrawableを生成して、
各状態に合わせてStateListDrawableを生成して終了となります。
例えばベースのアイコンがあったとして、
フィルターすることで、いろいろ色を変えられるので、
ヘッダーやタグなどで使う1つのアイコンから
動的にセレクターを生成することが可能となります。
背景も変えたい場合は、
前回の「StateListDrawable ①」と組み合わせても良いかもしれませんね。