/* * Overchan Android (Meta Imageboard Client) * Copyright (C) 2014-2016 miku-nyan <https://github.com/miku-nyan> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package nya.miku.wishmaster.ui.presentation; import android.graphics.Point; import android.os.Build; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextPaint; import android.view.View; import android.widget.TextView; /** * Обтеканием текстом картинки. Методы работают на Android >= 2.2, на более ранних версиях просто ничего не делается. * @author miku-nyan * */ public class FlowTextHelper { public static final boolean IS_AVAILABLE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO; private static boolean flowText(SpannableStringBuilder string, int width, int height, int textFullWidth, TextPaint textPaint) { if (IS_AVAILABLE && textFullWidth > width) { return FlowTextHelperImpl.flowText(string, width, height, textFullWidth, textPaint); } return false; } /** * Установить обтекание для Spanned текста (SpannableStringBuilder) * @param string текст * @param floatingModel модель обтекания текстом */ public static boolean flowText(SpannableStringBuilder string, FloatingModel floatingModel) { return flowText(string, floatingModel.width, floatingModel.height, floatingModel.textFullWidth, floatingModel.textPaint); } /** * Установить обтекание для Spanned текста (SpannableStringBuilder) для вывода на TextView с шириной отличной от указанной (измеренной) в floatingModel * @param string текст * @param floatingModel модель обтекания текстом * @param textFullWidth ширина TextView */ public static boolean flowText(SpannableStringBuilder string, FloatingModel floatingModel, int textFullWidth) { return flowText(string, floatingModel.width, floatingModel.height, textFullWidth, floatingModel.textPaint); } /** * Установить положение разметки для обтекания * @param thumbnailView обтекаемый объект * @param messageView обтекающий текст */ public static void setFloatLayoutPosition(View thumbnailView, TextView messageView) { if (IS_AVAILABLE) { FlowTextHelperImpl.setFloatLayoutPosition(thumbnailView, messageView); } } /** * Установить положение разметки по умолчанию * @param thumbnailView обтекаемый объект * @param messageView обтекающий текст */ public static void setDefaultLayoutPosition(View thumbnailView, TextView messageView) { if (IS_AVAILABLE) { FlowTextHelperImpl.setDefaultLayoutPosition(thumbnailView, messageView); } } /** * Класс модели обтекания текстом * @author miku-nyan * */ public static class FloatingModel { private final int width; private final int height; private final int textFullWidth; private final TextPaint textPaint; /** * Конструктор модели обтекания текстом * @param width ширина обтекаемого объекта * @param height высота обтекаемого объекта * @param textFullWidth ширина textview * @param textPaint кисть (объект TextPaint) textview */ public FloatingModel(int width, int height, int textFullWidth, TextPaint textPaint) { this.width = width; this.height = height; this.textFullWidth = textFullWidth; this.textPaint = textPaint; } /** * Конструктор модели обтекания текстом * @param thumbnailViewSize размер обтекаемого объекта (картинки-миниатюры), со всеми отступами * @param textFullWidth ширина textview * @param textPaint кисть (объект TextPaint) TextView */ public FloatingModel(Point thumbnailViewSize, int textFullWidth, TextPaint textPaint) { this.width = thumbnailViewSize.x; this.height = thumbnailViewSize.y; this.textFullWidth = textFullWidth; this.textPaint = textPaint; } @Override public boolean equals(Object o) { if (o instanceof FloatingModel) { FloatingModel f = (FloatingModel) o; return (f.width == width && f.height == height && f.textFullWidth == textFullWidth); } return false; } } /** * Получить позицию в spanned-строке, до которой установлено обтекание * @param spanned * @return позиция или -1, если обтекания нет */ public static int getFloatingPosition(Spanned spanned) { if (IS_AVAILABLE) { return FlowTextHelperImpl.getFloatingPosition(spanned); } return -1; } }