麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

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

本文實(shí)例為大家分享了Android實(shí)現(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)用該方法,當(dāng)printBitmap()方法調(diào)用時(shí),Android系統(tǒng)的打印界面
會(huì)彈出,用戶可以設(shè)置一些參數(shù),然后進(jìn)行打印或取消。

二、打印自定義文檔

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ù)第二個(gè)參數(shù)為繼承了抽象類PrintDocumentAdapter 的適配器類,第三個(gè)參數(shù)為 PrintAttributes對(duì)象,

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

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

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

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

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

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類的適當(dāng)回調(diào)方法表明執(zhí)行結(jié)果, onLayoutFinished()方法的布爾型參數(shù)指示布局內(nèi)容是否已經(jīng)改變。

onLayout()方法的主要任務(wù)就是計(jì)算在新的設(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()方法

當(dāng)需要將打印結(jié)果輸出到文件中時(shí),系統(tǒng)會(huì)調(diào)用onWrite()方法,該方法的參數(shù)指明要打印的頁以及結(jié)果寫入的文件,你的方法實(shí)現(xiàn)需要將頁面的內(nèi)容寫入到一個(gè)多頁面的PDF文檔中,當(dāng)這個(gè)過程完成時(shí),需要調(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()方法實(shí)現(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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: av电影免费播放 | 国产精品久久久久久久久久久久久久久 | 毛片视频播放 | 午夜视频色 | 性猛交ⅹxxx乱巴西 在线播放中文 | 性盈盈盈影院 | 久久综合婷婷香五月 | 一级黄色大片在线观看 | 国产高潮好爽受不了了夜色 | 成人不卡在线观看 | 欧美成人免费tv在线播放 | 91短视频在线播放 | 国产一区二区三区视频免费 | 亚洲午夜天堂吃瓜在线 | 天天操很很操 | 天堂成人一区二区三区 | 草草视频免费 | 国产高清一区 | 国产剧情在线观看一区二区 | 青青草成人免费视频在线 | 宅男噜噜噜66一区二区 | 黄色av网站在线观看 | 欧美成人免费小视频 | 成人不卡免费视频 | 成人做爰高潮片免费视频韩国 | 黄色片免费在线 | 黄色影院在线看 | 一级啪啪片| 毛片一级免费看 | 日韩视频在线不卡 | 亚洲精品aa | 污污黄 | 国产在线精品91 | 欧美日韩在线影院 | 一本色道精品久久一区二区三区 | 中国女警察一级毛片视频 | 日本成年免费网站 | 精品在线一区二区三区 | 欧美一级黄视频 | 国产精品成人一区二区三区电影毛片 | 国产精品v片在线观看不卡 成人一区二区三区在线 |