Как получить ссылку на верх и низ холста для динамического позиционирования?

У меня есть 2 TextView поверх ImageView. Я использую классы Canvas и Paint для рисования подписей к картинке. Я хочу, чтобы подписи имели зазор около 20 dp между верхней частью изображения и верхней частью TextView. Каковы способы получить эти значения для ввода в значение y Canvas.drawText()?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Происхождение текста похоже на изображение, оно начинается слева вверху, для верхнего текста просто установите начало координат y на +20dp, для нижнего текста установите начало координат y на text.height+20dp

Текст в центре:

x = image.width/2 - text.width/2;

Ось Y верхнего текста

y = 20;

Ось Y нижнего текста:

y = image.height - 20 - text.height;

Важно, чтобы вы измеряли текст, прежде чем пытаться получить ширину нарисованного текста.

Проверьте этот ответ: Измерение высоты текста для рисования на холсте (Android)

Я понимаю. Как насчет выравнивания центра TextView по центру холста?

Andros Adrianopolos 27.02.2019 03:56

Что-то вроде этого: y = image.height/2 - text.height/2

Sander Rito 27.02.2019 04:14

Вы можете это объяснить?

Andros Adrianopolos 27.02.2019 04:16

Я имел в виду горизонтальный центр холста и вертикальный центр TextView, чтобы текст располагался прямо в верхнем центре холста.

Andros Adrianopolos 27.02.2019 04:18

О, хорошо, в таком случае я ошибся, это ширина: x = image.width/2 - text.width/2, y = 20 (верхний текст), y = image.height - 20 - text.height (нижний текст )

Sander Rito 27.02.2019 04:21

Это помогло?

Sander Rito 27.02.2019 05:18

Не совсем. Не могли бы вы объяснить уравнение.

Andros Adrianopolos 27.02.2019 06:24

Если вы хотите сосредоточить что-то на контейнере, то середина контейнера является вашей точкой отсчета. Вот почему image.width/2. Если вы поместите текст в эту координату x, текст начнется в середине изображения и заполнит правую сторону, если изображение. Чтобы текст был «отцентрирован», вам нужно отрегулировать середину контейнера за вычетом половины ширины текста, таким образом, x = image.width/2 - text.width/2

Sander Rito 27.02.2019 06:28

Одна вещь, которую вы можете упустить, — это измерить текст перед его рисованием. Попробуйте найти ответ на что-то вроде этого: текст измерения холста и реализация этого в вашем коде перед drawText()

Sander Rito 27.02.2019 06:32

вы можете перейти по этой ссылке https://developer.android.com/training/custom-views/custom-drawing#java. Содержит подробное описание позиционирования. В твоем случае,

вам нужно сначала создать текст

 textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
   textPaint.setColor(textColor);
   if (textHeight == 0) {
       textHeight = textPaint.getTextSize();
   } else {
       textPaint.setTextSize(textHeight);
   }

   piePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
   piePaint.setStyle(Paint.Style.FILL);
   piePaint.setTextSize(textHeight);

   shadowPaint = new Paint(0);
   shadowPaint.setColor(0xff101010);
   shadowPaint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL));

вот так, и вам нужно установить отступ и разместить его там, где вы хотите, как показано ниже

// Account for padding
float xpad = (float)(getPaddingLeft() + getPaddingRight());
float ypad = (float)(getPaddingTop() + getPaddingBottom());

// Account for the label
if (showText) xpad += textWidth;

float ww = (float)w - xpad;
float hh = (float)h - ypad;

// Figure out how big we can make the pie.
float diameter = Math.min(ww, hh);

Я получил весь этот код из вышеупомянутого URL.

вам нужно добавить ниже код для позиционирования по центру

 Paint yourPaint = new Paint();

  int xP = (canvas.getWidth() / 2);
  int yP = (int) ((canvas.getHeight() / 2) - ((yourPaint .descent()yourPaint .ascent()) / 2)) ;

        canvas.drawText(yourTextView, xP, yP, yourPaint);

Думаю, я разобрался с этой частью. Теперь я просто хочу выровнять центр TextView с центром Canvas.

Andros Adrianopolos 27.02.2019 04:12

Я имел в виду, что у меня есть 2 TextViews сверху и снизу. Я хочу, чтобы мои TextViews, оставаясь в верхней и нижней части холста, также отображались в вертикальном центре (половина ширины) холста.

Andros Adrianopolos 27.02.2019 04:20

Итак, в основном я хочу выровнять центр TextView с центром Canvas (половина ширины)

Andros Adrianopolos 27.02.2019 04:21

Другие вопросы по теме