PDFViewDual viewCurl = new PDFViewCurl(this.getContext());
boolean parasC[] = new boolean[m_doc.GetPageCount()];
int current = 0;
while( current < parasC.length ) {
parasC[current] = false;
current++;
}
viewCurl.vSetLayoutPara(null, parasC, m_rtol, true);
m_view = viewCurl;
package com.radaee.view;
import com.radaee.pdf.DIB;
import com.radaee.pdf.Global;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Bitmap.Config;
import android.view.GestureDetector;
import android.view.MotionEvent;
/**
* @author Nermeen
*/
public class PDFViewCurl extends PDFViewDual {
private int page_w = 0;
private int page_h = 0;
private DIB m_dib1 = null;
private DIB m_dib2 = null;
private float m_stepy = 0;
private float m_stepx = 0;
private int m_hold_dir = 0;
private Bitmap mCurlBitmap;
private int m_hold_style = 0;
private boolean curling = false;
private boolean mCurlChangePage = false;
private GestureDetector m_gesture = null;
public PDFViewCurl(Context context) {
super(context);
m_pageno = 0;
m_dib1 = new DIB();
m_dib2 = new DIB();
mCurlAllowed = true;
m_gesture = new GestureDetector(context, new PDFGestureListener());
}
@Override
public void vClose() {
super.vClose();
if(m_dib1 != null) m_dib1.Free();
if(m_dib2 != null) m_dib2.Free();
m_dib1 = null;
m_dib2 = null;
m_pageno = 0;
}
@Override
public void vResize(int w, int h) {
if(w != m_w || h != m_h) {
m_scale = 0;
mCurlBitmap = null;
}
super.vResize(w, h);
}
@Override
protected void vLayout() {
super.vLayout();
vSetLock(3);
if( m_doc == null || m_w <= m_page_gap || m_h <= m_page_gap ) return;
page_w = (int) (max_w * m_scale);
page_h = (int) (max_h * m_scale);
if(m_status != STA_ZOOM) {
m_stepx = page_w / 8;
m_stepy = 0;
if(m_dib1 == null) m_dib1 = new DIB();
if(m_dib2 == null) m_dib2 = new DIB();
m_dib1.CreateOrResize(page_w, page_h);
m_dib2.CreateOrResize(page_w, page_h);
if((mCurlBitmap == null) && mCurlAllowed)
mCurlBitmap = Bitmap.createBitmap(page_w, page_h, Config.ARGB_8888);
}
}
@Override
protected boolean vOnFling(float dx, float dy, float velocityX, float velocityY) {
return true;
}
@Override
protected void vOnTimer(Object obj) {
if(m_status == STA_CURLING && m_hold_dir != 0 ) {
if( m_hold_dir < 0 ) { //next page
if( m_holdx <= -m_w/2 ) {
m_status = STA_NONE;
m_pageno ++;
endCurl();
if( m_listener != null)
m_listener.OnPDFPageChanged(m_pageno);
}
else {
m_holdx -= m_stepx;
m_holdy += m_stepy * m_stepx;
if( m_holdy < 0.0001 ) m_holdy = 0;
if( m_holdy > m_h - 0.0001 ) m_holdy = m_h;
}
}
else { //previous page
m_holdx += m_stepx;
m_holdy += m_stepy * m_stepx;
if( m_holdx >= ((m_w - m_pages[m_pageno].m_w) / 2) + m_pages[m_pageno].m_w) {
m_status = STA_NONE;
endCurl();
}
}
if( m_listener != null )
m_listener.OnPDFInvalidate(false);
}
else {
super.vOnTimer(obj);
}
}
private void endCurl() {
m_scroller.forceFinished(true);
m_scroller.setFinalX(m_cells[m_pageno].left);
m_scroller.setFinalY(0);
m_scroller.computeScrollOffset();
curling = false;
}
@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 ) {
curling = false;
m_scroller.forceFinished(true);
m_holdsx = m_scroller.getCurrX();
m_holdsy = m_scroller.getCurrY();
m_holdx = event.getX();
m_holdy = event.getY();
m_hold_style = 1;
if( m_holdx > m_w / 2 ) {
if(m_pageno == m_pages.length - 1)
m_hold_style = 0;
else
m_status = STA_MOVING;
}
else {
if(m_pageno == 0)
m_hold_style = 0;
else {
mCurlChangePage = true;
m_status = STA_MOVING;
}
}
if( m_listener != null ) m_listener.OnPDFInvalidate(false);
}
return true;
case MotionEvent.ACTION_MOVE:
if(mCurlAllowed && m_status == STA_MOVING) {
if(m_status != STA_ZOOM) {
if(mCurlChangePage) {
m_pageno --;
if( m_listener != null)
m_listener.OnPDFPageChanged(m_pageno);
mCurlChangePage = false;
}
curling = true;
}
m_holdx = event.getX();
m_holdy = event.getY();
if( m_listener != null ) m_listener.OnPDFInvalidate(false);
return true;
}
else
return super.motionNormal(event);
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if(m_status == STA_MOVING && mCurlAllowed && curling) {
m_holdx = event.getX();
m_holdy = event.getY();
if( m_holdx > m_w / 2 ) { //previous page
if( m_hold_style == 1 )//right-bottom corner
m_stepy = (m_h - m_holdy) / (m_w - m_holdx);
else//right-top corner
m_stepy = -m_holdy / (m_w - m_holdx);
m_hold_dir = 1;
}
else { //next page
if( m_hold_style == 1 ) {
m_stepy = (m_h - m_holdy) / (m_stepx * 3);
if( m_stepy < 0 ) m_stepy = 0;
}
else {
m_stepy = (0 - m_holdy) / (m_stepx * 3);
if( m_stepy > 0 ) m_stepy = 0;
}
m_hold_dir = -1;
}
m_status = STA_CURLING;
if( m_listener != null ) m_listener.OnPDFInvalidate(false);
return true;
}
else
return super.motionNormal(event);
case MotionEvent.ACTION_POINTER_DOWN:
if(event.getPointerCount() == 2 && m_status == STA_MOVING && m_lock != 5) {
curling = false;
mCurlAllowed = false;
return super.motionNormal(event);
}
}
return super.motionNormal(event);
}
@Override
public void vDraw(Canvas canvas) {
if(curling && mCurlAllowed && (m_status == STA_MOVING || m_status == STA_CURLING)) {
int cur = 0;
int disp_start = -1;
int disp_end = -1;
int sel_rect1[] = null;
int sel_rect2[] = null;
while( cur < m_pageno ) {
m_thread.end_render(m_pages[cur]);
cur++;
}
disp_start = cur;
canvas.drawColor(m_back);
if(m_pages[cur].m_w != mCurlBitmap.getWidth() || m_pages[cur].m_h != mCurlBitmap.getHeight() ) {
mCurlBitmap = Bitmap.createScaledBitmap(mCurlBitmap, m_pages[cur].m_w, m_pages[cur].m_h, false);
m_dib1.CreateOrResize(m_pages[cur].m_w, m_pages[cur].m_h);
m_dib2.CreateOrResize(m_pages[cur].m_w, m_pages[cur].m_h);
}
mCurlBitmap.eraseColor(m_back);
m_draw_bmp.Create(mCurlBitmap);
m_pages[cur].Draw(m_draw_bmp, m_pages[cur].m_x, m_pages[cur].m_y);
if( Global.dark_mode ) m_draw_bmp.Invert();
m_draw_bmp.Free(mCurlBitmap);
m_dib1.DrawRect(m_back, 0, 0, m_w, m_h, 1);
m_dib2.DrawRect(m_back, 0, 0, m_w, m_h, 1);
m_thread.start_render(m_pages[cur]);
m_pages[cur].DrawDIB(m_dib1, m_pages[cur].m_x, m_pages[cur].m_y);
if( sel_rect1 == null || sel_rect2 == null ) {
sel_rect1 = m_pages[cur].GetSelRect1(0, 0);
sel_rect2 = m_pages[cur].GetSelRect2(0, 0);
}
if( m_finder.find_get_page() == cur )
m_finder.find_draw_to_dib(m_dib1, m_pages[cur], 0, 0);
cur++;
if( cur < m_pages.length ) {
m_thread.start_render(m_pages[cur]);
m_pages[cur].DrawDIB(m_dib2, m_pages[cur].m_x, m_pages[cur].m_y);
//m_pages[cur].DrawDIB(m_dib2, m_pages[cur].m_x, 0);
if( sel_rect1 == null || sel_rect2 == null ) {
sel_rect1 = m_pages[cur].GetSelRect1(0, 0);
sel_rect2 = m_pages[cur].GetSelRect2(0, 0);
}
if( m_finder.find_get_page() == cur )
m_finder.find_draw_to_dib(m_dib2, m_pages[cur], 0, 0);
cur++;
if( Global.dark_mode ) {
if( m_h > m_w ) //vertical
Global.DrawScroll(mCurlBitmap, m_dib1, m_dib2, (int) m_holdx, m_h, -m_hold_style);
else
Global.DrawScroll(mCurlBitmap, m_dib1, m_dib2, (int) (m_holdx - (page_w / 2)), m_h, -m_hold_style);
}
else {
if( m_h > m_w ) //vertical
Global.DrawScroll(mCurlBitmap, m_dib1, m_dib2, (int) m_holdx, m_h, m_hold_style);
else
Global.DrawScroll(mCurlBitmap, m_dib1, m_dib2, (int) (m_holdx - (page_w / 2)), m_h, m_hold_style);
}
}
else {
m_draw_bmp.Create(mCurlBitmap);
m_dib1.DrawToBmp(m_draw_bmp, 0, 0);
if( Global.dark_mode ) m_draw_bmp.Invert();
m_draw_bmp.Free(mCurlBitmap);
}
disp_end = cur;
int cnt = m_pages.length;
while( cur < cnt ) {
m_thread.end_render(m_pages[cur]);
cur++;
}
canvas.drawBitmap(mCurlBitmap, (int)((m_w - m_pages[m_pageno].m_w) / 2), m_pages[m_pageno].m_y, null);
if( m_listener != null && disp_start >= 0 ) {
if( disp_end < 0 ) disp_end = m_pages.length;
while( disp_start < disp_end ) {
m_listener.OnPDFPageDisplayed(canvas, m_pages[disp_start]);
disp_start++;
}
if( sel_rect1 != null && sel_rect2 != null )
m_listener.OnPDFSelecting(canvas, sel_rect1, sel_rect2);
}
}
else
super.vDraw(canvas);
}
protected void vOnZoomEnd() {
super.vOnZoomEnd();
if(vGetScale() > vGetMinScale()) {
vSetLock(0);
mCurlAllowed = false;
}
else {
vSetLock(3);
mCurlAllowed = true;
}
}
@Override
public void vCenterPage(int pageno) {
if( m_pages == null || m_doc == null || m_w <= 0 || m_h <= 0 ) return;
int ccur = 0;
while( ccur < m_cells.length ) {
PDFCell cell = m_cells[ccur];
if(pageno == cell.page_left || pageno == cell.page_right) {
int left = m_cells[ccur].left;
int w = m_cells[ccur].right - left;
int x = left + (w - m_w)/2;
int oldx = m_scroller.getCurrX();
int oldy = m_scroller.getCurrY();
m_scroller.startScroll(oldx, oldy, x - oldx, 0, 0);
break;
}
ccur++;
}
}
class PDFGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(m_listener != null)
m_listener.OnPDFFling(e1, e2, velocityX, velocityY);
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
if( m_listener != null && e.getActionMasked() == MotionEvent.ACTION_UP) {
if( m_listener.OnPDFDoubleTapped(e.getX(), e.getY())) {
m_status = STA_NONE;
vOnZoomEnd();
return true;
}
else return false;
}
else
return false;
}
@Override
public void onLongPress(MotionEvent e) {
if( m_listener != null )
m_listener.OnPDFLongPressed(e.getX(), e.getY());
}
@Override
public void onShowPress(MotionEvent e) {
if( m_listener != null )
m_listener.OnPDFShowPressed(e.getX(), e.getY());
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
vSingleTap( e.getX(), e.getY() );
if( m_listener != null/* && m_status == STA_MOVING*/ ) {
if( m_listener.OnPDFSingleTapped(e.getX(), e.getY())) {
m_status = STA_NONE;
return true;
}
else
return false;
}
else
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
}
} RadaeePDF SDK for Android
Created : 2015-04-28 10:34:12, Last Modified : 2018-01-26 08:50:37