2014-01-11 3 views
4

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

+0

же проблема для меня .. –

ответ

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)); 
    } 
+0

Единственная проблема с этим решением является то, что он не будет правильно отображался первоначальный вид Pdf к новой расчетной шкалы (это оказывается для 1.0f масштаб). Только после выполнения некоторого взаимодействия (касания, панорамирования, масштабирования) он будет отображаться правильно. Любые способы принудительного первоначального рендеринга в новый масштаб? – Bruno

+0

Это старый пост, который не может его бросить снова. – hasan83

0

с этой страницей изменен размер загрузки слишком большой от вида. здесь метод «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())); 
    } 
} 

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

-1

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

requestLayout(); 
post(this); 

снова.

Так полный код выглядит следующим образом (правка коды перед последним комментарием: the accepted answer of this question):

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); 
    } 

Надеется, что это помогает.

0

Я получал ошибки относительно конечных переменных 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)); 
} 
Смежные вопросы