Frequently Asked Question
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);
}
}