У меня есть изображение (png и svg), которое по сути является символом карты.Я хотел бы добавить динамический текст к символу, чтобы представлять значения в разных местах.У меня нет опыта создания пользовательских Drawables и работы с XML, поэтому я немного запутался, как лучший подход к решению этой проблемы.
На данный момент я создал этот чертеж, который рисует текстовое представление поверх изображения, но у меня возникают проблемы с правильным размещением элементов, поскольку текстовое представление должно отображаться смещенным по вертикали относительно центра изображения.Мне также нужно, чтобы ImageView изменил размеры пропорционально TextView.
Я думаю, что следующий шаг - получить высоту и ширину TextView и заставить ImageView быть больше, чем эти размеры.Но как мне манипулировать положением текстового представления?
public class PricePinDrawable extends Drawable {
private final int DRAWABLE_SIZE = 32;
private final int DEFAULT_TEXT_SIZE = 12;
private final TextView textView;
private final ImageView imageView;
private final int intrinsicSize;
PricePinDrawable(@NonNull final Context context,
@NonNull final CharSequence text) {
intrinsicSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
DRAWABLE_SIZE,
context.getResources().getDisplayMetrics());
textView = createTextView(context, text);
imageView = createImageView(context);
}
private ImageView createImageView(Context context) {
final ImageView imageView = new ImageView(context);
final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER;
imageView.setLayoutParams(lp);
imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.price_pin));
imageView.measure(intrinsicSize,intrinsicSize);
imageView.layout(0,0, intrinsicSize,intrinsicSize);
return imageView;
}
private TextView createTextView(@NonNull final Context context,
@NonNull final CharSequence text) {
final TextView textView = new TextView(context);
final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER;
textView.setLayoutParams(lp);
textView.setGravity(Gravity.CENTER);
textView.setLines(1);
textView.setTextColor(Color.WHITE);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_TEXT_SIZE);
textView.setText(text);
textView.setWidth((int)Math.round(intrinsicSize));
textView.setHeight((int)Math.round(intrinsicSize));
textView.measure(intrinsicSize,intrinsicSize);
textView.layout(0,0, intrinsicSize,intrinsicSize);
return textView;
}
public void setText(@NonNull final CharSequence text) {
textView.setText(text);
invalidateSelf();
}
@Override
public void draw(@NonNull final Canvas canvas) {
imageView.draw(canvas);
textView.draw(canvas);
}
@Override
public void setAlpha(final int alpha) {
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
}
@Override
public int getIntrinsicHeight() {
return intrinsicSize;
}
@Override
public int getIntrinsicWidth() {
return intrinsicSize;
}
@Override
public int getOpacity() {
return PixelFormat.OPAQUE;
}
}