具有多个文本视图和图像视图的内容如何分解为页面而不是在android中使用滚动视图

时间:2014-08-27 09:03:12

标签: android pagination android-viewpager android-scrollview

我正在为android实现一个epub阅读器。我已经成功阅读了epub文件并将内容添加到动态文本视图和图像视图中。 因此,内容实际上由多个textview和imageview组成。

目前我使用了scrollview来阅读这本书。现在我需要将整个内容分解为页面(页面内容应基于屏幕大小)。

为此,我正在考虑使用ViewPager。因此,它可以轻松地在页面之间滑动。但是,如果你有其他解决方案,那将是一个很大的帮助。

任何人都可以帮助实现这个目标吗?

感谢。

1 个答案:

答案 0 :(得分:1)

以下是开始使用的内容,以下组件测量填充屏幕的文本,addText方法返回未安装的文本。

ImageView结合使用会增加测量高度的复杂性,因此我只是将其用于文本。您还可以调整值,删除多少个字符以更快地进行迭代,并检查可行性,如果行数与行高相结合可以更有效地完成。

请注意,该组件需要一个长字符串,它将为下一页留下什么子字符串。

public class ReaderLinearLayout extends LinearLayout {

    private static final int TEXT_SIZE = 44;
    private final DisplayMetrics dm = new DisplayMetrics();

    public ReaderLinearLayout(Context context) {
        super(context);
    }

    public ReaderLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public String addText(String text) {
        int height = getScreenHeight();

        String textLeftFromEnd = text;

        int textHeight = getTextHeight(text);

        while (textHeight > height) {
            text = text.substring(0, text.length() - 1);
            textHeight = getTextHeight(text);
        }

        TextView textView = new TextView(getContext());
        textView.setText(text);
        textView.setTextColor(Color.BLACK);
        textView.setTextSize(TEXT_SIZE);
        addView(textView);

        return textLeftFromEnd.subSequence(text.length(),
                textLeftFromEnd.length()).toString();
    }

    public int getTextHeight(final String text) {
        TextView textView = new TextView(getContext());
        textView.setText(text);
        textView.setTextSize(TEXT_SIZE);
        TextPaint textPaint = textView.getPaint();

        return new StaticLayout(text.toString(), textPaint, getScreenWidth(),
                Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true).getHeight();
    }

    public int getScreenHeight() {
        WindowManager wm = (WindowManager) getContext().getSystemService(
                Context.WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(dm);

        return dm.heightPixels;
    }

    public int getScreenWidth() {
        WindowManager wm = (WindowManager) getContext().getSystemService(
                Context.WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(dm);

        return dm.widthPixels;
    }
}