国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android實現(xiàn)系統(tǒng)打印功能

2019-10-21 21:32:44
字體:
供稿:網(wǎng)友

本文實例為大家分享了Android實現(xiàn)系統(tǒng)打印的具體代碼,供大家參考,具體內(nèi)容如下

一、打印圖片

使用PrintHelper類,如:

private void doPhotoPrint() { PrintHelper photoPrinter = new PrintHelper(getActivity()); photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT); Bitmap bitmap = BitmapFactory.decodeResource(getResources(),   R.drawable.droids); photoPrinter.printBitmap("droids.jpg - test print", bitmap);}

可以在應(yīng)用的菜單欄中調(diào)用該方法,當printBitmap()方法調(diào)用時,Android系統(tǒng)的打印界面
會彈出,用戶可以設(shè)置一些參數(shù),然后進行打印或取消。

二、打印自定義文檔

1.連接到PrintManager類:

private void doPrint() { // Get a PrintManager instance PrintManager printManager = (PrintManager) getActivity()   .getSystemService(Context.PRINT_SERVICE);  // Set job name, which will be displayed in the print queue String jobName = getActivity().getString(R.string.app_name) + " Document";  // Start a print job, passing in a PrintDocumentAdapter implementation // to handle the generation of a print document printManager.print(jobName, new MyPrintDocumentAdapter(getActivity()),   null); //}

注:print函數(shù)第二個參數(shù)為繼承了抽象類PrintDocumentAdapter 的適配器類,第三個參數(shù)為 PrintAttributes對象,

可以用來設(shè)置一些打印時的屬性。

2.創(chuàng)建打印適配器類

打印適配器與Android系統(tǒng)的打印框架進行交互,處理打印的生命周期方法。打印過程主要有以下生命周期方法:

  • onStart():當打印過程開始的時候調(diào)用;
  • onLayout():當用戶更改打印設(shè)置導(dǎo)致打印結(jié)果改變時調(diào)用,如更改紙張尺寸,紙張方向等;
  • onWrite():當將要打印的結(jié)果寫入到文件中時調(diào)用,該方法在每次onLayout()調(diào)用后會調(diào)用一次或多次;
  • onFinish():當打印過程結(jié)束時調(diào)用。

注:關(guān)鍵方法有onLayout()和onWrite(),這些方法默認都是在主線程中調(diào)用,因此如果打印過程比較耗時,應(yīng)該在后臺線程中進行。

3.覆蓋onLayout()方法

在onLayout()方法中,你的適配器需要告訴系統(tǒng)框架文本類型,總頁數(shù)等信息,如:

@Overridepublic void onLayout(PrintAttributes oldAttributes,      PrintAttributes newAttributes,      CancellationSignal cancellationSignal,      LayoutResultCallback callback,      Bundle metadata) { // Create a new PdfDocument with the requested page attributes mPdfDocument = new PrintedPdfDocument(getActivity(), newAttributes);  // Respond to cancellation request if (cancellationSignal.isCancelled() ) {  callback.onLayoutCancelled();  return; }  // Compute the expected number of printed pages int pages = computePageCount(newAttributes);  if (pages > 0) {  // Return print information to print framework  PrintDocumentInfo info = new PrintDocumentInfo    .Builder("print_output.pdf")    .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)    .setPageCount(pages);    .build();  // Content layout reflow is complete  callback.onLayoutFinished(info, true); } else {  // Otherwise report an error to the print framework  callback.onLayoutFailed("Page count calculation failed."); }}

注:onLayout()方法的執(zhí)行有完成,取消,和失敗三種結(jié)果,你必須通過調(diào)用 PrintDocumentAdapter.LayoutResultCallback類的適當回調(diào)方法表明執(zhí)行結(jié)果, onLayoutFinished()方法的布爾型參數(shù)指示布局內(nèi)容是否已經(jīng)改變。

onLayout()方法的主要任務(wù)就是計算在新的設(shè)置下,需要打印的頁數(shù),如通過打印的方向決定頁數(shù):private int computePageCount(PrintAttributes printAttributes) { int itemsPerPage = 4; // default item count for portrait mode  MediaSize pageSize = printAttributes.getMediaSize(); if (!pageSize.isPortrait()) {  // Six items per page in landscape orientation  itemsPerPage = 6; }  // Determine number of print items int printItemCount = getPrintItemCount();  return (int) Math.ceil(printItemCount / itemsPerPage);}

4.覆蓋onWrite()方法

當需要將打印結(jié)果輸出到文件中時,系統(tǒng)會調(diào)用onWrite()方法,該方法的參數(shù)指明要打印的頁以及結(jié)果寫入的文件,你的方法實現(xiàn)需要將頁面的內(nèi)容寫入到一個多頁面的PDF文檔中,當這個過程完成時,需要調(diào)用onWriteFinished() 方法,如:

@Overridepublic void onWrite(final PageRange[] pageRanges,     final ParcelFileDescriptor destination,     final CancellationSignal cancellationSignal,     final WriteResultCallback callback) { // Iterate over each page of the document, // check if it's in the output range. for (int i = 0; i < totalPages; i++) {  // Check to see if this page is in the output range.  if (containsPage(pageRanges, i)) {   // If so, add it to writtenPagesArray. writtenPagesArray.size()   // is used to compute the next output page index.   writtenPagesArray.append(writtenPagesArray.size(), i);   PdfDocument.Page page = mPdfDocument.startPage(i);    // check for cancellation   if (cancellationSignal.isCancelled()) {    callback.onWriteCancelled();    mPdfDocument.close();    mPdfDocument = null;    return;   }    // Draw page content for printing   drawPage(page);    // Rendering is complete, so page can be finalized.   mPdfDocument.finishPage(page);  } }  // Write PDF document to file try {  mPdfDocument.writeTo(new FileOutputStream(    destination.getFileDescriptor())); } catch (IOException e) {  callback.onWriteFailed(e.toString());  return; } finally {  mPdfDocument.close();  mPdfDocument = null; } PageRange[] writtenPages = computeWrittenPages(); // Signal the print framework the document is complete callback.onWriteFinished(writtenPages);  ...}

drawPage()方法實現(xiàn):

private void drawPage(PdfDocument.Page page) { Canvas canvas = page.getCanvas();  // units are in points (1/72 of an inch) int titleBaseLine = 72; int leftMargin = 54;  Paint paint = new Paint(); paint.setColor(Color.BLACK); paint.setTextSize(36); canvas.drawText("Test Title", leftMargin, titleBaseLine, paint);  paint.setTextSize(11); canvas.drawText("Test paragraph", leftMargin, titleBaseLine + 25, paint);  paint.setColor(Color.BLUE); canvas.drawRect(100, 100, 172, 172, paint);}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 邢台市| 松潘县| 乐都县| 城口县| 灵璧县| 合阳县| 驻马店市| 同仁县| 高淳县| 蛟河市| 微山县| 衡东县| 桃源县| 仙游县| 准格尔旗| 枣阳市| 龙门县| 荆门市| 五寨县| 红河县| 曲阜市| 福清市| 毕节市| 乌拉特后旗| 龙游县| 驻马店市| 张北县| 莒南县| 桃江县| 鄱阳县| 南投市| 渭源县| 治多县| 拉萨市| 博爱县| 潜山县| 怀集县| 漯河市| 南陵县| 红安县| 巨野县|