一直在看別人寫的文章,而自己卻不敢執(zhí)筆來(lái)寫,一是怕寫得不好,二是平時(shí)也不太有寫文章的習(xí)慣,所以總感覺看別人寫就好啦,但是最近工作遇到點(diǎn)問(wèn)題,本以為很簡(jiǎn)單的,但是奈何解決起來(lái)還是比較麻煩的
把Android中的文字轉(zhuǎn)換為圖片,并與現(xiàn)有的圖片合并打印??? /**因?yàn)槲沂亲鯬OS機(jī),所以有打印這一項(xiàng)*/
剛開始接到這個(gè)任務(wù)的時(shí)候,真的是比較緊張,自己是新人,怕做不好,所以在網(wǎng)上也找了不少資源來(lái)看,但是效果都不理想,甚至說(shuō)與想象中的差距很大,所以就自己寫了個(gè)打印的東西,好了廢話不多說(shuō)下面就開始正題吧
哦,對(duì)了,首先大家看下效果:

這個(gè)圖片就是生成的圖片,怎么做呢?
本來(lái)我的最初想法是 把文字按照待打印的組合形式把它組合成一個(gè)View,之后做出類似于[簡(jiǎn)書]app的圖片分享的效果,把View變成圖片,但是這樣做需要把文字一次性拿到手,估計(jì)在我們的項(xiàng)目中使用起來(lái)比較困難,所以就考慮把文字拿到手后,一行行的把文字畫出來(lái)
文章最后我把github地址貼出來(lái),方便大家查看

該方法比較容易理解,在這里我就說(shuō)下該方法的大致思路:
1.方法參數(shù)是待打印的文字的List集合,其中存放的就是一行行待打印的文字
2.讀入?yún)?shù)后,先配置生成圖片的寬度[為8的倍數(shù)],然后把每一行文字讀入計(jì),并計(jì)算這一行是否可以完全顯示,如果不能一行顯示需要多少行 /**8的倍數(shù)是打印機(jī)規(guī)定的,如果是測(cè)試倒無(wú)所謂*/

3.這里我們主要做得是把回車換行多算一行,以及大文字也多算一行,以便生成的位圖足夠大,并且把背景色設(shè)置成白色

4.生成空的位圖,開始遍歷List集合,繪制每一行,返回生成的圖片

對(duì)于圖片的合并,這個(gè)比文字生成圖片更簡(jiǎn)單一點(diǎn),我就不截圖了,復(fù)制點(diǎn)代碼吧:
1.取出兩張位圖,把最寬的設(shè)置為寬度,高度之和設(shè)置為生成圖片的高度
int width = Math.max(first.getWidth(), second.getWidth());
int height = first.getHeight() + second.getHeight();
2.這里比較麻煩的就是 logo的位置必須居中顯示,所以我們需要把logo繪制的起點(diǎn)改變一下
int startWidth = (width - first.getWidth()) / 2;
3.繪制即可
Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(first, startWidth, 0, null);
canvas.drawBitmap(second, 0, first.getHeight(), null);
其他方面的就不再多說(shuō)了,主要看下性能,我覺得圖太多的話,就比較慢了,主要是不管文字生成圖還是合成新圖,都會(huì)遇到設(shè)置背景色的問(wèn)題

這里是比較耗時(shí)的,如果圖片小的話,還是可以忍耐,但是當(dāng)合并的多的時(shí)候,就會(huì)很慢,當(dāng)然如果僅僅是生成文字話,還是一次設(shè)置就可以了,我這邊主要是有圖片,就說(shuō)我的例子:logo必須是居中打印的,如果合并圖片的時(shí)候,不讓背景為白色,logo不占空間的地方就是空,這時(shí)候打印出來(lái)的就是黑色的玩意,所以我是必須要加這部分代碼的,如果你在使用的時(shí)候僅僅是文字,圖片也是完整的圖,那就不必加我這部分了,耗時(shí)不得好。
當(dāng)然轉(zhuǎn)為圖片的形式不止這一種辦法,還有個(gè)將view截圖為Bitmap,之前也做過(guò),但是那樣做的不清晰,比較模糊,后面準(zhǔn)備補(bǔ)寫截圖的