MuPDF Android Pdf под размер экрана

Я успешно установил MuPDF для одного из моих приложений для Android. Но проблема в том, что при рендеринге я не могу разместить PDF на экране. Кто-нибудь может предложить мне, как этого добиться. Спасибо!


person Siva Bharata    schedule 11.01.2014    source источник


Ответы (4)


Измените метод measureView в ReaderView.java, чтобы он стал.

private void measureView(View v) {
        // See what size the view wants to be
        v.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        // Work out a scale that will fit it to this view
        float scale;
        if (getWidth()>getHeight())
        {
            scale = (float)getWidth()/(float)v.getMeasuredWidth();
            MIN_SCALE = (float)v.getMeasuredWidth()/(float)getWidth();
            MAX_SCALE = MIN_SCALE*5.0f;
        }
        else
            scale = Math.min((float)getWidth()/(float)v.getMeasuredWidth(),
                        (float)getHeight()/(float)v.getMeasuredHeight());

        // Use the fitting values scaled by our current scale factor
        v.measure(View.MeasureSpec.EXACTLY | (int)(v.getMeasuredWidth()*scale*mScale),
                View.MeasureSpec.EXACTLY | (int)(v.getMeasuredHeight()*scale*mScale));
    }
person hasan    schedule 16.01.2014
comment
Единственная проблема с этим решением заключается в том, что оно не будет правильно отображать исходное представление pdf в новом вычисленном масштабе (оно отображается для масштаба 1.0f). Только после некоторого взаимодействия (касания, панорамирования, масштабирования) он будет отображаться правильно. Есть ли способы заставить начальный рендеринг в новом масштабе? - person Bruno; 08.10.2014
comment
Это старый пост, не могу бросить его снова. - person hasan; 09.10.2014

Я получал ошибки в отношении конечных переменных шкалы MAX и MIN, однако я немного изменил решение @hassan83. Мое решение протестировано в MuPDF версии 1.9a

private void measureView(View v) {
    // See what size the view wants to be
    v.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    // Work out a scale that will fit it to this view
    float scale;
    //landscape orientation
    if (getWidth() > getHeight())
    {
        scale = (float)getWidth()/(float)v.getMeasuredWidth() * (1.0f ); //make sure that we fill the page by multiplying with a scale factor of one
    }
    else
        scale = Math.min((float)getWidth()/(float)v.getMeasuredWidth(),
                (float)getHeight()/(float)v.getMeasuredHeight());

    // Use the fitting values scaled by our current scale factor
    v.measure(View.MeasureSpec.EXACTLY | (int)(v.getMeasuredWidth()*scale*mScale),
            View.MeasureSpec.EXACTLY | (int)(v.getMeasuredHeight()*scale*mScale));
}
person Muchiri Kinyua    schedule 22.06.2016

при этом размер страницы будет изменен, загрузившись слишком большим по сравнению с представлением. вот метод "measureview" в моем коде:

    private void measureView(View v) {
    // See what size the view wants to be
    v.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

    if (!mReflow) {
        // Work out a scale that will fit it to this view
        float scale = Math.min((float) getWidth() / (float) v.getMeasuredWidth(),
                (float) getHeight() / (float) v.getMeasuredHeight());
        // Use the fitting values scaled by our current scale factor
        v.measure(MeasureSpec.AT_MOST | (int) (v.getMeasuredWidth() * (scale + 0.8f) * mScale),
                MeasureSpec.AT_MOST | (int) (v.getMeasuredHeight() * (scale+0.8f) * mScale));
    } else {
        v.measure(View.MeasureSpec.EXACTLY | (int) (v.getMeasuredWidth()),
                View.MeasureSpec.EXACTLY | (int) (v.getMeasuredHeight()));
    }
}

это то, что мне нужно, загрузите страницу, которая должна быть загружена точно в представлении, загрузитесь с читаемым текстом.

person Armando Marques da S Sobrinho    schedule 04.03.2015

Помимо ответа на https://stackoverflow.com/a/21168243/2982225, вы можете повторно отрендерить представление, добавив в конце следующий код:

requestLayout();
post(this);

опять таки.

Итак, полный код выглядит следующим образом (атрибуция кода перед последним комментарием: принятый ответ на этот вопрос):

private void measureView(View v) {
        // See what size the view wants to be
        v.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        // Work out a scale that will fit it to this view
        float scale;
        if (getWidth()>getHeight())
        {
            scale = (float)getWidth()/(float)v.getMeasuredWidth();
            MIN_SCALE = (float)v.getMeasuredWidth()/(float)getWidth();
            MAX_SCALE = MIN_SCALE*5.0f;
        }
        else
            scale = Math.min((float)getWidth()/(float)v.getMeasuredWidth(),
                        (float)getHeight()/(float)v.getMeasuredHeight());

        // Use the fitting values scaled by our current scale factor
        v.measure(View.MeasureSpec.EXACTLY | (int)(v.getMeasuredWidth()*scale*mScale),
                View.MeasureSpec.EXACTLY | (int)(v.getMeasuredHeight()*scale*mScale));

        // last comment
        // to force the initial rendering to the new scale

        requestLayout();
        post(this);
    }

Надеюсь это поможет.

person Petar Anastasov    schedule 07.07.2015