Создание Drawable / Bitmap, который позиционирует текст на изображении - PullRequest
0 голосов
/ 17 октября 2018

У меня есть изображение (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;
}
}
...