TextViewからDrawableを作成する(Android)

ImageViewからDrawable取得

ImageViewであればGetDrawableで取得可能。

TextView

TextViewだとGetDrawableは存在しない。
今回説明するのはこちら。

ではどうするか

とりあえずTextViewを作成。

TextView textView = new TextView(context);
textView.setText("test");

上記のtestと書かれたDrawableがほしいとする。

たとえば

たとえばこのDrawableとアプリのassets配下の画像を重ねたいとします。
ちなみにtestと書かれたTextViewは動的に変更されるとし、
先にレイヤーリストを作成しておくことが出来ない状況とします。

まずはassets配下の画像を読み込み、Drawable(BitmapDrawable)を作成します。

backgroundDrawable = 
	Drawable.createFromStream(context.getAssets().open("/path/to/img"), null);

※try catchは無視

このDrawableとTextViewのDrawableをLayerDrawableで擬似的に書くとこうなります。

Drawable[] layers = new Drawable[2];
layers[0] = backgroundDrawable;
layers[1] = textViewDrawable;  // これについては↓で説明
Drawable drawable = new LayerDrawable(layers);

TextViewからDrawableを作成する

Bitmap bgbmp = ((BitmapDrawable) backgroundDrawable).getBitmap();
TextView textView = new TextView(context);
textView.setText("test");
textView.setDrawingCacheEnabled(true);
textView.measure(
  View.MeasureSpec.makeMeasureSpec(bgbmp.getWidth(), View.MeasureSpec.EXACTLY), 
  View.MeasureSpec.makeMeasureSpec(bgbmp.getHeight(), View.MeasureSpec.EXACTLY)
); 
textView.layout(
	0, 
    0, 
    textView.getMeasuredWidth(), 
    textView.getMeasuredHeight()
);
textView.buildDrawingCache(true);
Bitmap bmp = Bitmap.createBitmap(textView.getDrawingCache());
textView.setDrawingCacheEnabled(false);
Drawable textViewDrawable = BitmapDrawable(context.getResources(), bmp);

※LayerDrawableで画像を重ねる場合、width、heightが違うと
問題が発生することが多いのでここではView.MeasureSpec.EXACTLYで合わせています。

LayerDrawableで重ねる必要がなければmeasureは以下で大丈夫です。
width, heightは自動計算されます。

textView.measure(
  View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED ), 
  View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED )
); 

最終的なソース

動的に変更されるTextViewのDrawableをassets配下のDrawableと重ねています。

// assets内のimg読み込み
backgroundDrawable = 
	Drawable.createFromStream(context.getAssets().open("/path/to/img"), null);
Bitmap bgbmp = ((BitmapDrawable) backgroundDrawable).getBitmap();
// 動的なtextViewを作成
TextView textView = new TextView(context);
textView.setText("test");
textView.setDrawingCacheEnabled(true);
// サイズをEXACTLYで指定
textView.measure(
  View.MeasureSpec.makeMeasureSpec(bgbmp.getWidth(), View.MeasureSpec.EXACTLY), 
  View.MeasureSpec.makeMeasureSpec(bgbmp.getHeight(), View.MeasureSpec.EXACTLY)
);
// サイズを確定させる 
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
// 描画キャッシュを有効
textView.buildDrawingCache(true);
// 描画したキャッシュを取得
Bitmap bmp = Bitmap.createBitmap(textView.getDrawingCache());
// 描画キャッシュを無効
textView.setDrawingCacheEnabled(false);
Drawable textViewDrawable = BitmapDrawable(context.getResources(), bmp);
// Drawableを重ねる
Drawable[] layers = new Drawable[2];
layers[0] = backgroundDrawable;
layers[1] = textViewDrawable;  
Drawable drawable = new LayerDrawable(layers);