欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

安卓(Android)開發(fā)之分享帶文字的圖片

 更新時間:2016年08月05日 10:11:13   投稿:daisy  
用過微信分享SDK的都應(yīng)該知道,微信分享到朋友圈的時候是不能同時分享圖片和文字的,只要有縮略圖,那么文字就不會生效。那么問題就來了,如果我們想把APP內(nèi)的某些內(nèi)容連帶圖片一起分享到微信,是不是沒辦法了呢?下面一起來看看怎么解決。

前言

想想我們常用的網(wǎng)易云音樂,允許我們把歌詞連帶著歌曲的圖片拼在一起變成一張圖,我們再把這張圖片分享出去就好了。

那么,本篇的內(nèi)容就是動手做一個帶文字的圖片。

這里也記錄下上下文,因為做了一個失物招領(lǐng)的App,當有人上交了失物之后,可以將這個消息分享出去,這個消息內(nèi)容有物品的信息和圖片,而微信SDK始終無法做到,就想著把物品信息嵌入到圖片中分享出去,先放一個效果圖:

 

這個分享出去的圖片很簡單,上面是圖片,下面是文字組合在一起。 

先要知道,方案的原理是通過操作一個以Bitmap為基礎(chǔ)的Canvas來做到的,思路很簡單:

     ① 讓畫布作用在Bitmap上

     ② 在畫布的上方繪制拍攝所得的圖片

     ③ 在②所繪制的圖片下面繪制文字

第一步很簡單,我們只需要構(gòu)造一個Bitmap并且裝載到Canvas中就可以了,假設(shè)拍攝得到的圖片名為bitmap,則代碼如下:

Bitmap.Config config = bitmap.getConfig();
Bitmap shareBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), config);
Canvas canvas = new Canvas(shareBitmap);

到這里我們就要思考了,這個圖片的寬高應(yīng)該怎么設(shè)置比較合理呢?上面的代碼設(shè)置為跟拍攝所得圖片一樣,也就是說,如果再需要添加文字,文字只能顯示在圖片上。這個時候,如果圖片的顏色比較豐富,那么文字疊在上面就會很難看得清楚了。按照我上面圖片的做法,是在拍攝圖片的下面增加一些空間來繪制文字,這里要設(shè)置的高度應(yīng)該要更加大一點。而究竟要多大我們等下再討論。 

第二步是在畫布中繪制拍攝所得的圖片,這里就很簡單了,直接有這樣的代碼:

canvas.drawBitmap(bitmap, 0, 0, paint);

接著是第三步,也是最難的地方。這里不能直接在canvas中直接調(diào)用drawText方法來繪制文字!為什么?因為我們的文字內(nèi)容有可能比圖片的寬度要大,當文字比圖片更寬的時候,使用drawText是無法讓文字內(nèi)容換行的,這樣文字就被截斷了。

解決的方案是使用TextPaint這個Paint的子類。這個類還需要配合StaticLayout來繪制文字,我們看看它的用法:

Paint paint = new Paint();
paint.setColor(Color.BLACK); // 畫筆顏色
TextPaint textpaint = new TextPaint(paint);
textpaint.setTextSize(textSize); // 文字大小
textpaint.setAntiAlias(true); // 抗鋸齒
StaticLayout title_layout = new StaticLayout(title.getText().toString(), textpaint, sourceBitmapWidth, Layout.Alignment.ALIGN_CENTER, 1f, 1f, true);

直接通過我們的Paint對象來創(chuàng)建一個TextPaint,接著設(shè)置抗鋸齒和文字大小。接著創(chuàng)建一個StaticLayout對象,構(gòu)造方法需要傳入的參數(shù)分別是:文字內(nèi)容、TextPaint對象、文本寬度、對齊方式、行距倍數(shù)、行距加數(shù)和是否包含內(nèi)邊距。這里比較重要的地方是設(shè)置文本寬度,當文本寬度比這個值大的時候就會自動換行。

當我們構(gòu)造好了這個StaticLayout之后,就可以對畫布進行定位,然后將文字繪制出來:

canvas.translate(0, sourceBitmapHeight); // 移動位置到圖片的下面
title_layout.draw(canvas); // 在畫布中繪制文字

 完成了這幾步之后,Canvas中的Bitmap就會有圖片和文字了。

但是我們的問題其實還沒有解決。

① 這個分享出去的Bitmap的高度究竟是多少呢?上面我們跳過了這個問題,其實已經(jīng)有答案了,我們可以讓它的高度為圖片的內(nèi)容加上我們創(chuàng)建的StaticLayout的高度就可以了。這樣圖片的高度會跟隨文字內(nèi)容的多少變化。獲取StaticLayout的高度比較簡單:

title_layout.getHeight()

②  這個時候,如果我們直接在App中顯示這個圖片,是沒有什么問題的,但是如果我們把圖片分享到微信,你會發(fā)現(xiàn),圖片的文字部分完全變成了黑色,連文字都看不到了。這里的解決辦法也很簡單,在繪制的時候,先給整個圖片繪制一個白色的背景:

canvas.drawColor(Color.WHITE);

這里就基本完成了,代碼也給出來大家參考下吧:

// 拍攝所得的圖片為imageBitmap
  private Bitmap getShareingBitmap(int textSize) {
    Bitmap.Config config = imageBitmap.getConfig();
    int sourceBitmapHeight = imageBitmap.getHeight();
    int sourceBitmapWidth = imageBitmap.getWidth();
    Paint paint = new Paint();
    paint.setColor(Color.BLACK); // 畫筆顏色
    TextPaint textpaint = new TextPaint(paint);
    textpaint.setTextSize(textSize); // 文字大小
    textpaint.setAntiAlias(true); // 抗鋸齒
    StaticLayout title_layout = new StaticLayout(title.getText().toString(), textpaint,
        sourceBitmapWidth, Layout.Alignment.ALIGN_CENTER, 1f, 1f, true);
    StaticLayout desc_layout = new StaticLayout("物品描述:"+description.getText().toString(), textpaint,
        sourceBitmapWidth, Layout.Alignment.ALIGN_NORMAL, 1f, 1f, true);
    StaticLayout phone_layout = new StaticLayout("聯(lián)系電話:"+phone.getText().toString(), textpaint,
        sourceBitmapWidth, Layout.Alignment.ALIGN_NORMAL, 1f, 1f, true);
    Bitmap share_bitmap = Bitmap.createBitmap(sourceBitmapWidth, sourceBitmapHeight +
        title_layout.getHeight() + desc_layout.getHeight() + phone_layout.getHeight(),
        config);
    Canvas canvas = new Canvas(share_bitmap);
    canvas.drawColor(Color.WHITE);
    canvas.drawBitmap(imageBitmap, 0, 0, paint); // 繪制圖片
    canvas.translate(0, sourceBitmapHeight);
    title_layout.draw(canvas);

    canvas.translate(0, title_layout.getHeight());
    phone_layout.draw(canvas);

    canvas.translate(0, phone_layout.getHeight());
    desc_layout.draw(canvas);
    return share_bitmap;
  }

總結(jié)

先計算所有文字內(nèi)容的高度,然后構(gòu)建圖片的大小,繪制白色背景,繪制拍攝圖片,在拍攝圖片下繪制文字。以上就是本文的全部內(nèi)容了,希望對大家開發(fā)Android有所幫助。

相關(guān)文章

  • Android開發(fā)Jetpack組件WorkManager用例詳解

    Android開發(fā)Jetpack組件WorkManager用例詳解

    這篇文章主要為大家介紹了Android開發(fā)Jetpack組件WorkManager的使用案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • flutter監(jiān)聽app進入前后臺狀態(tài)的實現(xiàn)

    flutter監(jiān)聽app進入前后臺狀態(tài)的實現(xiàn)

    在開發(fā)app的過程中,我們經(jīng)常需要知道app處于前后臺的狀態(tài),本文主要介紹了flutter監(jiān)聽app進入前后臺狀態(tài)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2022-04-04
  • 在Android中高效的加載大圖的方法示例

    在Android中高效的加載大圖的方法示例

    本篇文章主要介紹了在Android中高效的加載大圖的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • android如何取得本地通訊錄的頭像的原圖的實現(xiàn)代碼

    android如何取得本地通訊錄的頭像的原圖的實現(xiàn)代碼

    這篇文章主要介紹了android如何取得本地通訊錄的頭像的原圖的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Android WorkManager淺談

    Android WorkManager淺談

    這篇文章主要介紹了Android WorkManager淺談,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-08-08
  • Android自定義View實現(xiàn)時鐘效果

    Android自定義View實現(xiàn)時鐘效果

    這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)時鐘效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Android觀察者模式實例分析

    Android觀察者模式實例分析

    這篇文章主要介紹了Android觀察者模式,實例分析了Android觀察者模式的原理與相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • Android編程圖片操作類定義與用法示例【拍照,相冊選圖及裁剪】

    Android編程圖片操作類定義與用法示例【拍照,相冊選圖及裁剪】

    這篇文章主要介紹了Android編程圖片操作類定義與用法,涉及Android拍照,相冊選圖及裁剪等圖片操作功能及權(quán)限控制相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • Android序列化接口Parcelable與Serializable接口對比

    Android序列化接口Parcelable與Serializable接口對比

    我們使用 Intent 傳遞數(shù)據(jù)的時候,putExtra() 所支持的數(shù)據(jù)類型事有限的,當需要傳遞自定義對象的時候就需要序列化。Serializable更簡單但是會把整個對象進行序列化因此效率比Parcelable低一些
    2023-02-02
  • Android實現(xiàn)網(wǎng)易云音樂高仿版流程

    Android實現(xiàn)網(wǎng)易云音樂高仿版流程

    這篇文章主要介紹了Android實現(xiàn)網(wǎng)易云音樂高仿版,包含了首頁復(fù)雜發(fā)現(xiàn)界面布局和功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論