Как центрировать текст по горизонтали на холсте - PullRequest
0 голосов
/ 05 марта 2019

У меня есть ImageView с 2 TextViews.Я пытаюсь выровнять заголовки по медиане с медианой (ширина / 2) Canvas.Вот иллюстрация того, чего я пытаюсь достичь:

https://imgur.com/a/7fklSBv

До сих пор моя попытка выровнять TextView от его левого конца с вертикальным центром Canvas.

public void createBitmapAndSave(ImageView img) {

        BitmapDrawable bitmapDrawable = ((BitmapDrawable) img.getDrawable());
        Bitmap bitmap = bitmapDrawable.getBitmap();
        Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

        String topText = topTextView.getText().toString();
        String bottomText = bottomTextView.getText().toString();

        Canvas canvas = new Canvas(mutableBitmap);
        Paint topPaint = new Paint();
        Paint bottomPaint = new Paint();

        topPaint.setColor(Color.BLUE);
        topPaint.setStyle(Paint.Style.FILL);
        topPaint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
        topPaint.setTextSize(topTextView.getTextSize());

        bottomPaint.setColor(Color.RED);
        bottomPaint.setStyle(Paint.Style.FILL);
        bottomPaint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
        bottomPaint.setTextSize(bottomTextView.getTextSize());

        canvas.drawText(topText, (canvas.getWidth()) / 2, 200, topPaint);
        canvas.drawText(bottomText, (canvas.getWidth()) / 2, canvas.getHeight() - 200, bottomPaint);

        File file;
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();
        file = new File(path + "/SimpliMeme/" + timeStamp + "-" + counter + ".jpg");
        file.getParentFile().mkdir();

        try {
            OutputStream stream = new FileOutputStream(file);
            mutableBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            stream.flush();
            stream.close();
            Toast.makeText(getContext(), "Meme Saved", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Uri contentUri = Uri.fromFile(file);
        mediaScanIntent.setData(contentUri);
        Objects.requireNonNull(getContext()).sendBroadcast(mediaScanIntent);
        counter++;
    }

1 Ответ

0 голосов
/ 07 марта 2019

Это на самом деле просто.Все, что вам нужно сделать, это использовать метод Paint.measureText(), чтобы получить ширину текста, разделить на 2, чтобы получить его половину, а затем сдвинуть его влево, чтобы отцентрировать его.

Посмотрите на это,Я создал две float переменные, которые содержат ширину каждого текста в Canvas:

float topTextMeasurement = topPaint.measureText(topText);
float bottomTextMeasurement = bottomPaint.measureText(bottomText);

Затем я выполнил вышеуказанную настройку в параметрах x ваших Canvas.drawText() методов.

canvas.drawText(topText, topX - (topTextMeasurement/2), 200, topPaint);
canvas.drawText(bottomText, bottomX - (bottomTextMeasurement/2), canvas.getHeight() - 200, bottomPaint);

Но это только в том случае, если ваш текст не будет превышать ни одной строки.Для многострочных текстов, я предлагаю вам посмотреть DynamicLayout

...