2017-02-28 6 views
0

私は幸いにもAndroid PDFクラスPdfDocumentでPDFドキュメントを作成しています。 「微妙な」ドキュメント上の不可解な後、私は、座標系は、これは私のネクサス10にうまく働いたAndroidでの座標とクリッピングPDFドキュメント

private static final int A4_WIDTH = 595; 
private static final int A4_HEIGHT = 842; 
private static final int CM = 28; 
private static final int footer_height = CM; 



void startPage() { 
    if (currentPage != null) { 
     finishPage(currentPage); 
    } 
    PageInfo.Builder pageBuilder = new PageInfo.Builder(A4_WIDTH, A4_HEIGHT, page++); 
    Rect rect = new Rect(0, 0, A4_WIDTH, A4_HEIGHT); 
    rect.inset(CM, 2 * CM); 
    pageBuilder.setContentRect(rect); 
    PageInfo pageInfo = pageBuilder.create(); 
    pagePosition = 0.0f; 
    pageWidth = rect.width(); 
    pageHeight = rect.height(); 
    currentPage = super.startPage(pageInfo); 
    page_count++; 
    if (has_footer) 
     putFooter(); 

} 

のPostScript(1/72" )であったことを占っが、座標系際サムスンS6に私はむしろ驚きましたネクサス10ではテキストを0,0にして2cm下と1cmにうまくフィットしますが、S6では4cm下に2cm、さらに下と右を2cmと1cmで切り取っています。言い換えれば、クリッピング矩形は適切な場所にあるが、座標系が二重にオフセットされています表示されます

私のドローコードは次のようになります。

 canvas.save(); 
     canvas.translate(0, pagePosition); 
     staticLayout.draw(canvas); 
     canvas.restore(); 

ここで、pagePositionは、staticLayout.getHeight()の結果からテキストを測定することによって駆動される単純なpsカウンタです。

明確にするために、レイアウトは、テキスト、線画、およびイメージの合理的に複雑なミックスの上に虚偽のないスポットであり、ちょうどこのデバイス依存の虚偽を得た。

バグか私の脳ですか?

編集:左がネクサスで、右S6

ある

Left Nexus - Right S6

生成するコード:

import android.annotation.TargetApi; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.graphics.RectF; 
import android.graphics.pdf.PdfDocument; 
import android.support.v4.content.ContextCompat; 

import uk.co.spennycycles.pocketcycletech.PocketCycleTechApp; 
import uk.co.spennycycles.pocketcycletech.R; 



    @TargetApi(19) 

public class TestReport extends PdfDocument { 
private static final String TAG = SpennyPdfDocument.class.getSimpleName(); 
private static final int A4_WIDTH = 595; 
private static final int A4_HEIGHT = 842; 
private static final int CM = 28; 
int pageWidth; 
int pageHeight; 


public void generateReport() { 
PageInfo.Builder pageBuilder = new PageInfo.Builder(A4_WIDTH, A4_HEIGHT, 1); 
Rect rect = new Rect(0, 0, A4_WIDTH, A4_HEIGHT); 
rect.inset(CM, 2 * CM); 
pageBuilder.setContentRect(rect); 
PageInfo pageInfo = pageBuilder.create(); 
Page page = super.startPage(pageInfo); 

pageWidth = rect.width(); 
pageHeight = rect.height(); 
Canvas canvas = page.getCanvas(); 

RectF r = new RectF((float) 0, 0, pageWidth, pageHeight); 
r.inset(1.0f, 1.0f); 
Paint paint = new Paint(); 
paint.setAntiAlias(true); 
paint.setDither(true); 
paint.setStyle(Paint.Style.FILL); 

paint.setColor(ContextCompat.getColor(PocketCycleTechApp.getContext(), R.color.lt_gray)); 
canvas.drawRect(r, paint); 

paint.setColor(ContextCompat.getColor(PocketCycleTechApp.getContext(), R.color.black)); 

paint.setStrokeWidth(2.0f); 
paint.setStyle(Paint.Style.STROKE); 
canvas.drawRect(r, paint); 
paint.setStyle(Paint.Style.FILL_AND_STROKE); 

canvas.drawLine(r.left, r.top, r.right, r.bottom, paint); 
canvas.drawLine(r.right, r.top, r.left, r.bottom, paint); 

finishPage(page); 
} 
} 

答えて

0

が回避策:

currentPage = super.startPage(pageInfo); 
    Canvas canvas = currentPage.getCanvas(); 
    canvas.translate(CM, CM*2); 
    canvas.clipRect(0, 0, rect.width(), rect.height()); 

がまったく同じ状態でキャンバスを残し。

関連する問題