Frequently Asked Question

How to make page corners rounded?
Last Updated 11 months ago

If you want to have a rounded page corners effect, you need to do the following:

(Note: the below code has a problem when the gap between pages is small, we are working on it, the article will be updated as soon as it’s solved)

RDPDFReader module:

You need to add the following method to PDFLayout class

protected void drawRoundedCorners(Canvas canvas, int scrollX, int scrollY, float radius, int pageno, Region.Op op) {

if(m_pages == null || pageno < 0 || pageno >= m_pages.length || m_pages[pageno] == null)

return;

Path mClipPath = new Path();

Paint paint = new Paint();

paint.setColor(m_back_color);

paint.setAntiAlias(true);

VPage vpage = m_pages[pageno];

int x = vpage.GetX() - scrollX, y = vpage.GetY() - scrollY, width = x + vpage.GetWidth()

, height = y + vpage.GetHeight();

//top-left

mClipPath.addCircle(x + radius,y + radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(x, y, radius, paint);

//top-right

mClipPath.addCircle(width - radius, y + radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(width, y, radius, paint);

//bottom-left

mClipPath.addCircle(x + radius, height - radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(x, height, radius, paint);

//bottom-right

mClipPath.addCircle(width - radius, height - radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(width, height, radius, paint);

}

Then call it from vDrawNormal as follows:

drawRoundedCorners(canvas, x, y, radius, m_pageno, Region.Op.DIFFERENCE);

drawRoundedCorners(canvas, x, y, radius, m_pageno + 1, Region.Op.DIFFERENCE);

After:

canvas.drawBitmap(m_bmp, 0, 0, null);

For dual view mode, you need to override the method in PDFLayoutDual:

protected void drawRoundedCorners(Canvas canvas, int scrollX, int scrollY, float radius, int pageno, Region.Op op) {

if(m_pages == null || pageno < 0 || pageno >= m_pages.length || m_pages[pageno] == null)

return;

Path mClipPath = new Path();

Paint paint = new Paint();

paint.setColor(m_back_color);

paint.setAntiAlias(true);

VPage vpage = m_pages[pageno];

int x = vpage.GetX() - scrollX, y = vpage.GetY() - scrollY, width = x + vpage.GetWidth()

, height = y + vpage.GetHeight();

int ccur = 0;

while( ccur < m_cells.length ) {

if( pageno == m_cells[ccur].page_left || pageno == m_cells[ccur].page_right )

break;

ccur++;

}

if(pageno == m_cells[ccur].page_left) { //top-left

mClipPath.addCircle(x + radius, y + radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(x, y, radius, paint);

//bottom - left

mClipPath.addCircle(x + radius, height - radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(x, height, radius, paint);

}

if(pageno == m_cells[ccur].page_right || m_cells[ccur].page_right == -1) { //top-right

mClipPath.addCircle(width - radius, y + radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(width, y, radius, paint);

//bottom-right

mClipPath.addCircle(width - radius, height - radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(width, height, radius, paint);

}

}

PDFReader module:

You need to add the following method to PDFView class

protected void drawRoundedCorners(Canvas canvas, int scrollX, int scrollY, float radius, int pageno, Region.Op op) {

if(m_pages == null || pageno < 0 || pageno >= m_pages.length || m_pages[pageno] == null)

return;

Path mClipPath = new Path();

Paint paint = new Paint();

paint.setColor(m_back);

paint.setAntiAlias(true);

PDFVPage vpage = m_pages[pageno];

int x = vpage.GetX() - scrollX, y = vpage.GetY() - scrollY, width = x + vpage.GetWidth()

, height = y + vpage.GetHeight();

//top-left

mClipPath.addCircle(x + radius,y + radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(x, y, radius, paint);

//top-right

mClipPath.addCircle(width - radius, y + radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(width, y, radius, paint);

//bottom-left

mClipPath.addCircle(x + radius, height - radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(x, height, radius, paint);

//bottom-right

mClipPath.addCircle(width - radius, height - radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(width, height, radius, paint);

}

Then call it from vDraw as follows:

drawRoundedCorners(canvas, left, top, radius, m_pageno, Region.Op.DIFFERENCE);

drawRoundedCorners(canvas, left, top, radius, m_pageno + 1, Region.Op.DIFFERENCE);

After:

if( Global.dark_mode ) m_draw_bmp.Invert();

m_draw_bmp.Free(m_bmp);

canvas.drawBitmap(m_bmp, 0, 0, null);

For dual view mode, you need to override the method in PDFViewDual:

protected void drawRoundedCorners(Canvas canvas, int scrollX, int scrollY, float radius, int pageno, Region.Op op) {

if(m_pages == null || pageno < 0 || pageno >= m_pages.length || m_pages[pageno] == null)

return;

Path mClipPath = new Path();

Paint paint = new Paint();

paint.setColor(m_back);

paint.setAntiAlias(true);

PDFVPage vpage = m_pages[pageno];

int x = vpage.GetX() - scrollX, y = vpage.GetY() - scrollY, width = x + vpage.GetWidth()

, height = y + vpage.GetHeight();

int ccur = 0;

while( ccur < m_cells.length ) {

if( pageno == m_cells[ccur].page_left || pageno == m_cells[ccur].page_right )

break;

ccur++;

}

if(pageno == m_cells[ccur].page_left) { //top-left

mClipPath.addCircle(x + radius, y + radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(x, y, radius, paint);

//bottom - left

mClipPath.addCircle(x + radius, height - radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(x, height, radius, paint);

}

if(pageno == m_cells[ccur].page_right || m_cells[ccur].page_right == -1) { //top-right

mClipPath.addCircle(width - radius, y + radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(width, y, radius, paint);

//bottom-right

mClipPath.addCircle(width - radius, height - radius, radius, Path.Direction.CW);

canvas.clipPath(mClipPath, op);

canvas.drawCircle(width, height, radius, paint);

}

}


Loading ...