android異步生成圖片的示例代碼
下面來說說在Android上如果異步生成圖片,通過xml布局用View排版好圖片樣式,在子線程生成一張圖片,以滿足生成用來分享的圖片等需求(生成圖片前設(shè)置可變元素,如用戶的頭像,昵稱等)。
效果
點(diǎn)擊按鈕生成圖片:

特性
- 通過布局和View的方式設(shè)計(jì)圖片樣式。
- 在子線程中生成和保存圖片。
- 封裝好工具類,直接使用即可。
核心代碼
private Bitmap createBitmap(View view) {
int widthSpec = View.MeasureSpec.makeMeasureSpec(view.getLayoutParams().width, View.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(view.getLayoutParams().height, View.MeasureSpec.EXACTLY);
view.measure(widthSpec, heightSpec);
int measureWidth = view.getMeasuredWidth();
int measureHeight = view.getMeasuredHeight();
view.layout(0, 0, measureWidth, measureHeight);
int width = view.getWidth();
int height = view.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
return bitmap;
}
原理說明
通過走一遍ViewGroup的測量(measure),布局(layout),draw流程,把布局展示的界面畫到我們準(zhǔn)備好的bitmap上(這一過程可在非UI線程完成),再把bitmap保存在文件或顯示到界面上。
- 在布局中寫好圖片的樣子,然后把布局inflate成View,當(dāng)然也可以直接代碼編寫View,設(shè)置好里面的可變元素,如頭像,昵稱等。
- 通過調(diào)用View的measure,layout方法使之測量出內(nèi)部各控件的大小和排列好各控件。
- 創(chuàng)建一個(gè)和View大小相同的空Bitmap,新建一個(gè)畫布傳入該bitamp(new Canvas(bitmap)),調(diào)用view的draw(canvas)方法,view會把圖片繪制在該bitmap上。
- 保存到文件或直接使用圖片。
使用方法
在xml中布局圖片樣式:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#ECAA0A">
<ImageView
android:layout_width="160dp"
android:layout_height="94dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/pic_bg" />
<ImageView
android:id="@+id/invitation_share_link_pic_avatar_iv"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="10dp"
android:src="@mipmap/ic_launcher" />
</FrameLayout>
寫一個(gè)自己的Model繼承自GenerateModel,設(shè)置可變元素并使用GeneratePictureManager單例的generate方法開始生成:
private void generate() {
SharePicModel sharePicModel = new SharePicModel((ViewGroup) getWindow().getDecorView());
sharePicModel.setAvatarResId(R.mipmap.ic_launcher);
GeneratePictureManager.getInstance().generate(sharePicModel, (throwable, bitmap) -> {
if (throwable != null || bitmap == null) {
Toast.makeText(this, getString(R.string.generate_pic_error), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, getString(R.string.generate_pic_success), Toast.LENGTH_SHORT).show();
mResultIv.setImageBitmap(bitmap);
}
});
}
源碼地址Github: https://github.com/homgwu/picgenerator
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter實(shí)現(xiàn)自定義下拉選擇框的示例詳解
在一些列表頁面中,我們經(jīng)常會有上方篩選項(xiàng)的的需求,點(diǎn)擊出現(xiàn)一個(gè)下拉菜單,而在Flutter中,并沒有現(xiàn)成的這樣的組件,所以最好我們可以自己做一個(gè)。本文將利用Flutter實(shí)現(xiàn)自定義下拉選擇框,需要的可以參考一下2022-04-04
Android關(guān)于獲取時(shí)間的記錄(小結(jié))
這篇文章主要介紹了Android關(guān)于獲取時(shí)間的記錄(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Kotlin新手基礎(chǔ)學(xué)習(xí)之Elvis操作符
Kotlin 是一種在 Java 虛擬機(jī)上運(yùn)行的靜態(tài)類型編程語言,被稱之為 Android 世界的Swift,由 JetBrains 設(shè)計(jì)開發(fā)并開源,下面這篇文章主要給大家介紹了關(guān)于Kotlin新手基礎(chǔ)學(xué)習(xí)之Elvis操作符的相關(guān)資料,需要的朋友可以參考下。2017-12-12
Android如何使用正則表達(dá)式只保留字母數(shù)字
在做項(xiàng)目的過程中,使用正則表達(dá)式來匹配一段文本中的特定種類字符,是比較常用的一種方式,下面這篇文章主要給大家介紹了關(guān)于Android如何使用正則表達(dá)式只保留字母數(shù)字的相關(guān)資料,需要的朋友可以參考下2022-05-05
Android 實(shí)現(xiàn)九宮格抽獎(jiǎng)功能
這篇文章主要介紹了Android 實(shí)現(xiàn)九宮格抽獎(jiǎng)功能,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03
Android 桌面圖標(biāo)右上角顯示未讀消息數(shù)字
本文主要介紹了Android 桌面圖標(biāo)右上角顯示未讀消息數(shù)字的方法。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04
android通過gps獲取定位的位置數(shù)據(jù)和gps經(jīng)緯度
這篇文章主要介紹了android通過gps獲取定位的位置數(shù)據(jù)示例,大家參考使用吧2014-01-01
Android簡單實(shí)用的可拖拽GridView組件分享
在我們?nèi)粘i_發(fā)中,使用?GridView?這種網(wǎng)格視圖的場合還是不少的,本篇我們來介紹一個(gè)支持拖拽的?GridView?組件,可以輕松搞定網(wǎng)格視圖的拖拽排序,需要的可以參考一下2023-06-06

