У меня есть 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 для отображения в моем растровом изображении?
Зачем?? почему бы не увеличить сам TextView
?
@pskink: Потому что я не хочу, чтобы текст переносился. Я хочу, чтобы расположение текстовых строк оставалось неизменным при масштабировании.
будет так же - переноса текста не будет
@pskink: Вы можете привести пример?
Просто вызовите ниже метод 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 Сообщите мне, если это не сработает. Примите ответ, если работает.
Нет, это не сработало, как ожидалось. Однако сейчас я использую TextView, для которого выполняю масштабирование в dispatchTouchEvent.
используйте
song_textview.getHeight()
, подойдет вам