Отображение TextView как ImageView для включения масштабирования

У меня есть TextView, который содержит динамический текст (разной длины). Чтобы включить плавное сжатие и масштабирование, я хотел бы преобразовать этот TextView в ImageView и отобразить этот ImageView вместо TextView. Итак, я попытался программно настроить TextView следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.song_view);

    String text = getIntent().getStringExtra(SongbookListFragment.SONG_TEXT_ARGS);

    song_textview = new AppCompatTextView(this);
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    song_textview.setLayoutParams(layoutParams);
    song_textview.setPadding(PADDING,PADDING,PADDING,PADDING);
    song_textview.setText(Html.fromHtml(text));
    song_textview.setTextColor(Color.BLACK);
    song_textview.setBackgroundColor(Color.TRANSPARENT);
    song_textview.setHorizontallyScrolling(true);
    song_textview.setTextSize(16);
}

В моем song_view.xml используется масштабируемый PhotoView, который расширяет ImageView:

<?xml version = "1.0" encoding = "utf-8"?>
<ScrollView
    xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:fillViewport = "true">
    <com.github.chrisbanes.photoview.PhotoView
        android:id = "@+id/imageview_songtext"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"/>
</ScrollView>

Теперь в методе действия onWindowFocusChanged я конвертирую TextView в Bitmap и отображаю его в PhotoView следующим образом:

@Override
public void onWindowFocusChanged(boolean hasFocus){
    super.onWindowFocusChanged(hasFocus);

    int width = this.getWindow().getDecorView().getWidth();
    int height = this.getWindow().getDecorView().getHeight();
    Bitmap bitmapHolder = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(bitmapHolder);
    if (song_textview != null) {
        song_textview.layout(0, 0, width, height);
        song_textview.draw(c);
        PhotoView songPhotoView = findViewById(R.id.imageview_songtext);
        songPhotoView.setImageBitmap(bitmapHolder);
    }
}

Это работает хорошо, за исключением того, что я не знаю, как установить высота растрового изображения в onWindowFocusChanged. Если я использую this.getWindow().getDecorView().getHeight(), как в моем примере кода выше, длина текста сокращается, потому что this.getWindow().getDecorView().getHeight() возвращает высоту экрана, а не фактическую высоту TextView. Конечно, TextView не добавляется в макет, поэтому нет измеренной высоты. Итак, как я могу получить полную длину TextView для отображения в моем растровом изображении?

используйте song_textview.getHeight(), подойдет вам

userI 02.05.2018 11:16

Зачем?? почему бы не увеличить сам TextView?

pskink 02.05.2018 11:18

@pskink: Потому что я не хочу, чтобы текст переносился. Я хочу, чтобы расположение текстовых строк оставалось неизменным при масштабировании.

to_sam 02.05.2018 11:52

будет так же - переноса текста не будет

pskink 02.05.2018 11:53

@pskink: Вы можете привести пример?

to_sam 02.05.2018 12:00
0
5
81
1

Ответы 1

Просто вызовите ниже метод setText.

public void setText(String text){
            Paint paint = new Paint();
            paint.setTextSize(30);
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.FILL);
            Rect result = new Rect();
            paint.getTextBounds(text, 0, text.length(), result);
            int width=  result.width();
            //background color red
            int color=Color.RED;
            Bitmap img=drawText(text, width, color);
            songPhotoView.setImageBitmap(img);
            //background transparent
            int colorT=Color.TRANSPARENT;
            Bitmap img1=drawText(text,width,colorT);
            songPhotoView.setImageBitmap(img1);
        }

        public Bitmap drawText(String text, int textWidth, int color) {
            // Get text dimensions
            TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
            textPaint.setStyle(Paint.Style.FILL);
            textPaint.setColor(Color.parseColor("#ff00ff"));
            textPaint.setTextSize(30);
            StaticLayout mTextLayout = new StaticLayout(text, textPaint, textWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);
            // Create bitmap and canvas to draw to
            Bitmap b = Bitmap.createBitmap(textWidth, mTextLayout.getHeight(), Bitmap.Config.ARGB_4444);
            Canvas c = new Canvas(b);
            // Draw background
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(color);
            c.drawPaint(paint);
            // Draw text
            c.save();
            c.translate(0, 0);
            mTextLayout.draw(c);
            c.restore();
            return b;
        }

@ user41854 Сообщите мне, если это не сработает. Примите ответ, если работает.

Deˣ 02.05.2018 12:55

Нет, это не сработало, как ожидалось. Однако сейчас я использую TextView, для которого выполняю масштабирование в dispatchTouchEvent.

to_sam 02.05.2018 14:56

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