Hi, I followed this post in knowledge base
How to avoid page change during pan if zoom level>1.0?
I could stop going to next page when zoomed in portrait orientation, but not in landscape orientation.
After some debug, I found that the m_horz_dual[m_pageno] is null and throw a java.lang.NullPointerException.
Please help, thank you!
Below is the code I added in
PDFViewDual class:,
motionNormal and
vOnFling
@Override
protected boolean motionNormal(MotionEvent event)
{
if (m_gesture.onTouchEvent(event)) return true;
switch (event.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
if (m_status == STA_NONE)
{
m_scroller.forceFinished(true);
m_scroller.abortAnimation();
m_holdsx = m_scroller.getCurrX();
m_holdsy = m_scroller.getCurrY();
m_holdx = event.getX();
m_holdy = event.getY();
m_status = STA_MOVING;
}
break;
case MotionEvent.ACTION_MOVE:
if (m_status == STA_MOVING)
{
m_movex = event.getX();
m_movey = event.getY();
int x = (int) (m_holdsx + m_holdx - m_movex);
int y = (int) (m_holdsy + m_holdy - m_movey);
if (m_lock == 1 || m_lock == 3) x = (int) m_holdsx;
if (m_lock == 2 || m_lock == 3) y = (int) m_holdsy;
if (x + m_w > m_docw) x = m_docw - m_w;
if (vGetScale() > vGetMinScale())
{
try
{
if (Global.def_view == 6 && m_w > m_h && m_horz_dual[m_pageno])
{ //dual page
if ((m_pageno + 2 < m_pages.length) && x + m_w > m_pages[m_pageno + 2].m_x) x = m_pages[m_pageno + 2].m_x - m_w;
if (m_pageno > 0 && x <= (m_pages[m_pageno - 1].m_x + m_pages[m_pageno - 1].m_w)) x = (m_pages[m_pageno - 1].m_x + m_pages[m_pageno - 1].m_w);
}
else
{ //single page
if ((m_pageno + 1 < m_pages.length) && x + m_w > m_pages[m_pageno + 1].m_x) x = m_pages[m_pageno + 1].m_x - m_w;
if (m_pageno > 0 && x <= (m_pages[m_pageno - 1].m_x + m_pages[m_pageno - 1].m_w)) x = (m_pages[m_pageno - 1].m_x + m_pages[m_pageno - 1].m_w);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
if (x < 0) x = 0;
if (y + m_h > m_doch) y = m_doch - m_h;
if (y < 0) y = 0;
m_scroller.setFinalX(x);
m_scroller.setFinalY(y);
if (m_listener != null) m_listener.OnPDFInvalidate(false);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (m_status == STA_MOVING)
{
m_movex = event.getX();
m_movey = event.getY();
int x = (int) (m_holdsx + m_holdx - m_movex);
int y = (int) (m_holdsy + m_holdy - m_movey);
if (m_lock == 1 || m_lock == 3) x = (int) m_holdsx;
if (m_lock == 2 || m_lock == 3) y = (int) m_holdsy;
if (x + m_w > m_docw) x = m_docw - m_w;
if (vGetScale() > vGetMinScale())
{
try
{
if (Global.def_view == 6 && m_w > m_h && m_horz_dual[m_pageno])
{ //dual page
if ((m_pageno + 2 < m_pages.length) && x + m_w > m_pages[m_pageno + 2].m_x) x = m_pages[m_pageno + 2].m_x - m_w;
if (m_pageno > 0 && x <= (m_pages[m_pageno - 1].m_x + m_pages[m_pageno - 1].m_w)) x = (m_pages[m_pageno - 1].m_x + m_pages[m_pageno - 1].m_w);
}
else
{ //single page
if ((m_pageno + 1 < m_pages.length) && x + m_w > m_pages[m_pageno + 1].m_x) x = m_pages[m_pageno + 1].m_x - m_w;
if (m_pageno > 0 && x <= (m_pages[m_pageno - 1].m_x + m_pages[m_pageno - 1].m_w)) x = (m_pages[m_pageno - 1].m_x + m_pages[m_pageno - 1].m_w);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
if (x < 0) x = 0;
if (y + m_h > m_doch) y = m_doch - m_h;
if (y < 0) y = 0;
m_scroller.setFinalX(x);
m_scroller.setFinalY(y);
m_status = STA_NONE;
vOnMoveEnd(x, y);
if (m_listener != null) m_listener.OnPDFInvalidate(false);
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
if (event.getPointerCount() == 2 && m_status == STA_MOVING && m_lock != 5)
{
m_scroller.forceFinished(true);
m_scroller.abortAnimation();
m_holdx = (event.getX(0) + event.getX(1)) / 2;
m_holdy = (event.getY(0) + event.getY(1)) / 2;
float dx = event.getX(0) - event.getX(1);
float dy = event.getY(0) - event.getY(1);
m_zoom_pos = vGetPos((int) m_holdx, (int) m_holdy);
m_zoom_dis1 = FloatMath.sqrt(dx * dx + dy * dy);
m_zoom_dis2 = m_zoom_dis1;
m_zoom_scale = m_scale;
int cur = m_prange_start;
int cnt = m_prange_end;
while (cur < cnt)
{
m_pages[cur].CreateBmp();
m_thread.end_render(m_pages[cur]);
cur++;
}
m_drawbmp = true;
m_status = STA_ZOOM;
}
break;
}
return true;
}
@Override
protected boolean vOnFling(float dx, float dy, float velocityX, float velocityY)
{
float ddx = (velocityX < 0) ? -velocityX : velocityX;
float ddy = (velocityY < 0) ? -velocityY : velocityY;
if (ddx < ddy) return false;
if (dx < (m_w >> 2) && dx > -(m_w >> 2)) return false;
if (ddx < (m_w >> 1) && ddx > -(m_w >> 1)) return false;
if (vGetScale() > vGetMinScale()) return true;
int x = m_scroller.getCurrX();
int y = m_scroller.getCurrY();
if (x + m_w > m_docw) x = m_docw - m_w;
if (x < 0) x = 0;
if (y + m_h > m_doch) y = m_doch - m_h;
if (y < 0) y = 0;
int ccur = 0;
while (ccur < m_cells.length)
{
PDFCell cell = m_cells[ccur];
if (m_holdsx >= cell.left && m_holdsx < cell.right)
{
if (m_rtol)
{
if (dx > 0)
{
if (ccur < m_cells.length - 1)
{
int endx = m_cells[ccur + 1].right - m_w;
m_scroller.startScroll(x, y, endx - x, 0);
}
else
m_scroller.startScroll(x, y, -x, 0);
}
else
{
if (ccur > 0)
{
int endx = cell.right;
m_scroller.startScroll(x, y, endx - x, 0);
}
else
m_scroller.startScroll(x, y, m_cells[ccur].right - m_w, 0);
}
}
else
{
if (dx > 0)
{
if (ccur > 0)
{
int endx = m_cells[ccur - 1].right - m_w;
m_scroller.startScroll(x, y, endx - x, 0);
}
else
m_scroller.startScroll(x, y, -x, 0);
}
else
{
if (ccur < m_cells.length - 1)
{
int endx = cell.right;
m_scroller.startScroll(x, y, endx - x, 0);
}
else
m_scroller.startScroll(x, y, m_cells[ccur].right - m_w, 0);
}
}
return true;
}
ccur++;
}
return false;
}