web-dev-qa-db-ja.com

Androidプログラムで画像にテキストを追加する

Androidの画面を開くようなアプリケーションを作りたい。tableLayoutの行に画像を動的に追加している。 xmlファイルでtableLayoutを定義しただけで、残りのコードはJavaです。画像を正常に追加しましたが、その画像のテキスト(画像の下にテキストを表示したい)と画像を特定のパディングに設定するのに助けがありません。方法は?よろしくお願いします。

11
dka72

代わりにできることは、RelativeLayoutを使用してTextViewをImageViewのオーバーレイに配置することです:)

10
StErMi

次の関数を使用して、画像にテキストを書き込みます。

private BitmapDrawable writeTextOnDrawable(int drawableId, String text) {

    Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId)
            .copy(Bitmap.Config.ARGB_8888, true);

    Typeface tf = Typeface.create("Helvetica", Typeface.BOLD);

    Paint paint = new Paint();
    Paint.setStyle(Style.FILL);
    Paint.setColor(Color.WHITE);
    Paint.setTypeface(tf);
    Paint.setTextAlign(Align.CENTER);
    Paint.setTextSize(convertToPixels(mContext, 11));

    Rect textRect = new Rect();
    Paint.getTextBounds(text, 0, text.length(), textRect);

    Canvas canvas = new Canvas(bm);

    //If the text is bigger than the canvas , reduce the font size
    if(textRect.width() >= (canvas.getWidth() - 4))     //the padding on either sides is considered as 4, so as to appropriately fit in the text
        Paint.setTextSize(convertToPixels(mContext, 7));        //Scaling needs to be used for different dpi's

    //Calculate the positions
    int xPos = (canvas.getWidth() / 2) - 2;     //-2 is for regulating the x position offset

    //"- ((Paint.descent() + Paint.ascent()) / 2)" is the distance from the baseline to the center.
    int yPos = (int) ((canvas.getHeight() / 2) - ((Paint.descent() + Paint.ascent()) / 2)) ;  

    canvas.drawText(text, xPos, yPos, Paint);

    return new BitmapDrawable(getResources(), bm);
}



public static int convertToPixels(Context context, int nDP)
{
    final float conversionScale = context.getResources().getDisplayMetrics().density;

    return (int) ((nDP * conversionScale) + 0.5f) ;

}
33
Arun George

KotlinバージョンのArunの ソリューション

import org.jetbrains.anko.dip

fun Context.writeTextOnDrawable(drawableId: Int, text: String) =
        DrawableUtil.writeTextOnDrawableInternal(this, drawableId, text, 25, -2, 0)

object DrawableUtil {

    fun writeTextOnDrawableInternal(context: Context, drawableId: Int, text: String,
            textSizeDp: Int, horizontalOffset: Int, verticalOffset: Int): BitmapDrawable {

        val bm = BitmapFactory.decodeResource(context.resources, drawableId)
                .copy(Bitmap.Config.ARGB_8888, true)

        val tf = Typeface.create("Helvetica", Typeface.BOLD)

        val Paint = Paint()
        Paint.style = Paint.Style.FILL
        Paint.color = Color.WHITE
        Paint.typeface = tf
        Paint.textAlign = Paint.Align.LEFT
        Paint.textSize = context.dip(textSizeDp).toFloat()

        val textRect = Rect()
        Paint.getTextBounds(text, 0, text.length, textRect)

        val canvas = Canvas(bm)

        //If the text is bigger than the canvas , reduce the font size
        if (textRect.width() >= canvas.getWidth() - 4)
            //the padding on either sides is considered as 4, so as to appropriately fit in the text
            Paint.textSize = context.dip(12).toFloat()

        //Calculate the positions
        val xPos = canvas.width.toFloat()/2 + horizontalOffset  

        //"- ((Paint.descent() + Paint.ascent()) / 2)" is the distance from the baseline to the center.
        val yPos = (canvas.height / 2 - (Paint.descent() + Paint.ascent()) / 2) + verticalOffset

        canvas.drawText(text, xPos, yPos, Paint)

        return BitmapDrawable(context.resources, bm)
    }
}

画像にテキストを追加するという問題をうまく実装できました。次のコードを見てください。まず、1つのビューをそのレイアウトの相対レイアウトとして取得し、そのEditTextとそのボタンの後にImageViewを取得します。それぞれにIDを付けます。以下にloadBitmapFromView関数を記述します。

public Bitmap loadBitmapFromView(View v) {
        Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Config.ARGB_8888);
        Canvas c = new Canvas(b);
        v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
        v.draw(c);
        return b;
    }

ボタンをクリックすると。

               Bitmap bitmap = loadBitmapFromView(relativeLayout);
                File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),         "folderName");
                if (!dir.exists())
                    dir.mkdirs();

                File file = new File(dir, "capture.jpg");
                try {
                    FileOutputStream fos = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                    imageView.setImageBitmap(bitmap);    
                } catch (Exception e) {
                    Log.e("ExpressionEditImageActivity", "Error, " + e);
                }

楽しい...

詳細については、以下のスクリーンショットを参照してください: enter image description here

2
Ganesh Katikar