Как создать epub reader с горизонтальным веб-обзором, как fbreader? - PullRequest
0 голосов
/ 15 апреля 2020

Я создаю приложение для чтения книг, для создания этого я использую Это lib для читателя. Эта библиотека очень хорошо работает для книг на английском языке, но она не подходит для персидских книг. Для персидских книг нам нужно прокрутить справа налево. на этой прокрутке библиотеки слева направо. Пожалуйста, помогите мне решить эту проблему. это мой java код для этого приложения.

public class HorizontalWebView extends WebView {
private float x1 = -1;
private int pageCount = 0;
Context mContext;

public HorizontalWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mContext = context;
    setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            int pageCount = Integer.parseInt(message);
            setPageCount(pageCount);
            result.confirm();
            return true;
        }
    });
}

public void injectCSS() {
    InputStream inputStream = null;
    try {
        inputStream = mContext.getAssets().open("style.css");
        byte[] buffer = new byte[inputStream.available()];
        if (inputStream.read(buffer) == 0)
            inputStream.close();
        String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
        this.loadUrl("javascript:(function() {" +
                "var parent = document.getElementsByTagName('head').item(0);" +
                "var style = document.createElement('style');" +
                "style.type = 'text/css';" +
                // Tell the browser to BASE64-decode the string into your script !!!
                "style.innerHTML = window.atob('" + encoded + "');" +
                "parent.appendChild(style)" +
                "})()");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void injectJavascript() {
    String js = "function initialize(){\n" +
            "    var d = document.getElementsByTagName('body')[0];\n" +
            "    var ourH = window.innerHeight - 20;\n" +
            "    var ourW = window.innerWidth - (2*20);\n" +
            "    var fullH = d.offsetHeight;\n" +
            "    var pageCount = Math.floor(fullH/ourH)+1;\n" +
            "    var currentPage = 0;\n" +
            "    var newW = pageCount*window.innerWidth - (2*20);\n" +
            "    d.style.height = ourH+'px';\n" +
            "    d.style.width = newW+'px';\n" +
            "    d.style.margin = 0;\n" +
            "    d.style.webkitColumnGap = '40px';\n" +
            "    d.style.webkitColumnCount = pageCount;\n" +
            "    return pageCount;\n" +
            "}";
    this.loadUrl("javascript:$js");
    this.loadUrl("javascript:alert(initialize())");
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            x1 = event.getX();
            break;
        case MotionEvent.ACTION_UP:
            float x2 = event.getX();
            float deltaX = x2 - x1;
            if (Math.abs(deltaX) > 100) {
                // Left to Right swipe action
                if (x2 > x1) {
                    turnPageLeft();
                    return true;
                }

                // Right to left swipe action
                else {
                    turnPageRight();
                    return true;
                }

            }
            break;
    }
    return true;
}

private int current_x = 0;

private void turnPageLeft() {
    if (getCurrentPage() > 0) {
        int scrollX = getPrevPagePosition();
        loadAnimation(scrollX);
        current_x = scrollX;
        scrollTo(scrollX, 0);
    }
}

private int getPrevPagePosition() {
    int prevPage = getCurrentPage() - 1;
    return (int) Math.ceil(prevPage * this.getMeasuredWidth());
}

private void turnPageRight() {
    if (getCurrentPage() < pageCount - 1) {
        // int paddingOffset = 10;
        int scrollX = getNextPagePosition();
        loadAnimation(scrollX);
        current_x = scrollX;
        scrollTo(scrollX, 0);
    }
}

private void loadAnimation(int scrollX) {
    ObjectAnimator anim = ObjectAnimator.ofInt(this, "scrollX",
            current_x, scrollX);
    anim.setDuration(500);
    anim.setInterpolator(new LinearInterpolator());
    anim.start();
}

private int getNextPagePosition() {
    int nextPage = getCurrentPage() + 1;

    return (int) Math.ceil(nextPage * this.getMeasuredWidth());
}

public int getCurrentPage() {
    int n = (int) (Math.ceil((double) getScrollX() / this.getMeasuredWidth()));
    return n;
}

public int getPageCount() {
    return pageCount;
}

public void setPageCount(int pageCount) {
    this.pageCount = pageCount;
}

}

...