亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android實現系統打印功能

2019-10-21 21:32:44
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android實現系統打印的具體代碼,供大家參考,具體內容如下

一、打印圖片

使用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);}

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

二、打印自定義文檔

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函數第二個參數為繼承了抽象類PrintDocumentAdapter 的適配器類,第三個參數為 PrintAttributes對象,

可以用來設置一些打印時的屬性。

2.創建打印適配器類

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

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

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

3.覆蓋onLayout()方法

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

@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()方法的執行有完成,取消,和失敗三種結果,你必須通過調用 PrintDocumentAdapter.LayoutResultCallback類的適當回調方法表明執行結果, onLayoutFinished()方法的布爾型參數指示布局內容是否已經改變。

onLayout()方法的主要任務就是計算在新的設置下,需要打印的頁數,如通過打印的方向決定頁數: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()方法

當需要將打印結果輸出到文件中時,系統會調用onWrite()方法,該方法的參數指明要打印的頁以及結果寫入的文件,你的方法實現需要將頁面的內容寫入到一個多頁面的PDF文檔中,當這個過程完成時,需要調用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()方法實現:

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);}

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜视频一区二区| 日韩av黄色在线观看| 国产欧美欧洲在线观看| 久久久久久网站| 亚洲精品国产精品国自产观看浪潮| 欧美人成在线视频| 91性高湖久久久久久久久_久久99| 不卡av电影院| 91色琪琪电影亚洲精品久久| 亚洲综合日韩中文字幕v在线| 国产日韩欧美在线观看| 欧美贵妇videos办公室| 成人精品久久av网站| 国产成人福利夜色影视| 欧美亚洲另类制服自拍| 亚洲综合中文字幕在线观看| 午夜精品久久久久久99热软件| 一区二区三区高清国产| 成人免费看黄网站| 国产免费观看久久黄| 欧美一级淫片aaaaaaa视频| 亚洲精品视频网上网址在线观看| 国产精品网站视频| 日韩在线观看免费av| 欧美综合第一页| 国产极品jizzhd欧美| 久热精品视频在线观看一区| 亚洲人av在线影院| 欧美xxxx做受欧美| 久久精品国产一区二区电影| 亚洲欧洲日本专区| 91麻豆国产精品| 欧美另类极品videosbestfree| 日韩经典中文字幕| 亚洲欧美在线一区二区| 91视频国产高清| 91在线高清免费观看| 久久久久免费精品国产| 日韩精品在线观| 久久夜色精品亚洲噜噜国产mv| 亚洲国产精品久久精品怡红院| 欧洲精品毛片网站| 57pao国产精品一区| 成人性生交大片免费看视频直播| 亚洲日本欧美日韩高观看| 日韩中文字幕在线观看| 亚洲字幕一区二区| 98视频在线噜噜噜国产| 夜夜躁日日躁狠狠久久88av| 亚洲人成网站免费播放| 国产精品一区二区三区在线播放| 日韩美女av在线免费观看| 国产亚洲精品久久久久久| 欧美激情第6页| 日韩中文字幕免费视频| 久久久亚洲福利精品午夜| 91夜夜未满十八勿入爽爽影院| 国产成人aa精品一区在线播放| 91视频-88av| 精品无人国产偷自产在线| 中文字幕在线观看日韩| 欧美精品在线视频观看| 一道本无吗dⅴd在线播放一区| 日韩在线国产精品| 国产精品xxx视频| 国产日韩欧美在线看| 96sao精品视频在线观看| 中文字幕亚洲专区| 久久在线免费视频| 久久久久久久激情视频| 日韩av片永久免费网站| 国产精品日日做人人爱| 91av成人在线| 亚洲美女在线观看| 亚洲日韩欧美视频| 亚洲第一网中文字幕| 国产一级揄自揄精品视频| 中文字幕国产精品| 日韩视频永久免费观看| 国产精品自产拍在线观| 91欧美日韩一区| 国产欧美日韩精品专区| 国产一区二区美女视频| 久久视频这里只有精品| 日韩欧美黄色动漫| 国产精品jvid在线观看蜜臀| 久久综合伊人77777尤物| 国产精品免费一区二区三区都可以| 91美女片黄在线观看游戏| 欧美猛男性生活免费| 亚洲成人在线网| 永久555www成人免费| 福利视频第一区| 久久久精品国产网站| 欧美成人在线免费| 日韩欧美成人网| 亚洲欧美另类在线观看| 亚洲白虎美女被爆操| 欧美激情一级欧美精品| 亚洲欧洲av一区二区| 欧美日韩激情美女| 韩日精品中文字幕| 欧美另类第一页| 亚洲国产成人精品一区二区| 欧美日韩在线视频一区| 国产精品91一区| 国产精品久久久久久久av电影| 欧美一区二粉嫩精品国产一线天| 欧美裸体视频网站| 成人久久18免费网站图片| 亚洲另类欧美自拍| 奇米成人av国产一区二区三区| 国产精品久久久久久久一区探花| 日韩中文字幕视频在线| 97在线观看视频| 亚洲精品国产精品自产a区红杏吧| 精品久久久久久久久久ntr影视| 欧美国产视频一区二区| 亚洲欧洲日产国产网站| 国产精品亚洲片夜色在线| 欧美日韩在线视频一区二区| 欧美三级免费观看| 国外色69视频在线观看| 国产成人啪精品视频免费网| 亚洲天堂av女优| 亚洲男人av在线| 亚洲男人天堂九九视频| 亚洲网站在线播放| 欧美日韩美女视频| 色综合91久久精品中文字幕| 国产视频久久网| 国产精品免费看久久久香蕉| 亚洲国产成人爱av在线播放| 亚洲第一av在线| 亚洲国产女人aaa毛片在线| 中文字幕欧美亚洲| 91精品国产91久久久久久| 久久精品国产免费观看| 亚洲尤物视频网| 国产精品免费久久久| 国产精品男人的天堂| 亚洲国产成人久久综合| 欧美日韩一区二区在线播放| 亚洲美女喷白浆| 亚洲欧美三级伦理| 国产精品高潮粉嫩av| 国产精品日韩在线一区| 一区二区三区无码高清视频| 国产精品中文久久久久久久| 91精品视频在线| 欧美夫妻性生活视频| 91牛牛免费视频| 国产激情久久久| 成人免费观看a| 国产精品视频公开费视频| 日韩69视频在线观看| 91在线观看免费| 久久成年人免费电影| 亚洲男人天堂古典| 欧美日韩成人精品| 欧美国产日韩在线| 日韩欧美黄色动漫| 精品视频9999| 欧美激情网友自拍|