Android 后臺(tái)生成長圖并分享示例(非長截圖)
先看需求:
1.用戶點(diǎn)擊生成長圖按鈕,彈出等待框,后臺(tái)生成一張長圖。
2.用戶展示界面和最終生成的長圖,布局完全不一樣,所以不能通過直接將view轉(zhuǎn)換成bitmap,或者長截圖來實(shí)現(xiàn)。
3.生成的長圖,頭部加上公司logo,尾部加上二維碼。
難點(diǎn)分析:
1.后臺(tái)進(jìn)行。
2.長圖保證清晰度,并且不能過大,過大可能會(huì)分享失敗。
效果展示:
具體實(shí)現(xiàn): 長圖描述(純手畫,別介意 T_T)
1.準(zhǔn)備數(shù)據(jù):
a.所需的文字內(nèi)容
b.所需的圖片(必須下載到本地,你可以開啟一個(gè)線程進(jìn)行圖片的下載,在圖片下載完成后,再進(jìn)行繪制的操作)
2.大致流程:
創(chuàng)建一個(gè)類繼承自LinearLayout,初始化綁定xml布局文件: (布局中需要包含的是頭部view、底部view等寬高固定的view;文字等高度wrap_content的view需要在代碼中動(dòng)態(tài)繪制出來,不然高度會(huì)有問題,下文有說明)
public LiveDrawLongPictureUtil(Context context) { super(context); init(context);} public LiveDrawLongPictureUtil(Context context, AttributeSet attrs) { super(context, attrs); init(context);} public LiveDrawLongPictureUtil(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);} private void init(Context context) { this.context = context; // 初始化各個(gè)控件 rootView = LayoutInflater.from(context) .inflate(R.layout.layout_draw_long_picture, this, false); llTopView = rootView.findViewById(R.id.llTopView);// 頭部view,高度固定,可直接獲取到對(duì)應(yīng)的bitmap llContent = rootView.findViewById(R.id.llContent);// 各種固定高度的view,高度固定,可直接獲取到對(duì)應(yīng)的bitmap llBottomView = rootView.findViewById(R.id.llBottomView);// 底部view,高度固定,可直接獲取到對(duì)應(yīng)的bitmap // 測(cè)量各個(gè)塊兒的view的寬高(這步很重要,后面需要用到寬高數(shù)據(jù),進(jìn)行畫布的創(chuàng)建) layoutView(llTopView); layoutView(llContent); layoutView(llBottomView); widthTop = llTopView.getMeasuredWidth(); heightTop = llTopView.getMeasuredHeight(); widthBottom = llBottomView.getMeasuredWidth(); heightBottom = llBottomView.getMeasuredHeight(); } // 測(cè)量view寬高的方法(僅測(cè)量父布局) private void measureView(View v) { int width = HomepageUtil.getPhoneWid(); int height = HomepageUtil.getPhoneHei(); v.layout(0, 0, width, height); int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY); int measuredHeight = View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); v.measure(measuredWidth, measuredHeight); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); }
獲取第一步得到的數(shù)據(jù),包括圖片,需要下載完畢,這是前提;
a.計(jì)算頭部view、底部view、中間文字內(nèi)容、中間圖片,以及其他view的總高度(px)和寬度(px);
b.創(chuàng)建一個(gè)空白的bitmap,使用bitmap的createBitmap方法,傳入第一步計(jì)算得到的寬高,Config可以隨意,推薦RGB_565(省內(nèi)存):
Bitmap bitmapAll = Bitmap.createBitmap(allBitmapWidth, allBitmapHeight, Bitmap.Config.RGB_565);// 創(chuàng)建所需大小的bitmap Canvas canvas = new Canvas(bitmapAll);// 創(chuàng)建空白畫布 canvas.drawColor(Color.WHITE);// 背景顏色 Paint paint = new Paint();// 畫筆 paint.setAntiAlias(true);// 設(shè)置抗鋸齒 paint.setDither(true);// 防抖動(dòng) paint.setFilterBitmap(true);// 設(shè)置允許過濾
c.把view從頂部到底部的順序,一塊塊繪制到畫布上;
d.全部view繪制完畢后,保存bitmapAll到本地文件,如需壓縮,可壓縮到指定大小和尺寸;
e.進(jìn)行分享的操作。至此,基本過程就這樣。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android利用Flutter實(shí)現(xiàn)立體旋轉(zhuǎn)效果
本文主要介紹了Flutter繪圖如何使用ImageShader填充圖形,并且利用 Matrix4的三維變換加上動(dòng)畫實(shí)現(xiàn)了立體旋轉(zhuǎn)的動(dòng)畫效果,感興趣的可以嘗試一下2022-06-06Android檢測(cè)手機(jī)中存儲(chǔ)卡及剩余空間大小的方法(基于Environment,StatFs及DecimalFormat
這篇文章主要介紹了Android檢測(cè)手機(jī)中存儲(chǔ)卡及剩余空間大小的方法,基于Environment,StatFs及DecimalFormat實(shí)現(xiàn)該功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-01-01Fedora14下android開發(fā): eclipse與ibus確有沖突的問題分析
本篇文章是對(duì)Fedora14下android開發(fā),eclipse與ibus確有沖突的問題進(jìn)行了分析介紹,需要的朋友參考下2013-05-05React Native學(xué)習(xí)之Android的返回鍵BackAndroid詳解
這篇文章主要給大家介紹了關(guān)于React Native學(xué)習(xí)之Android的返回鍵BackAndroid的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用React Native具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧。2017-10-10android計(jì)算器實(shí)現(xiàn)兩位數(shù)的加減乘除
這篇文章主要為大家詳細(xì)介紹了android計(jì)算器實(shí)現(xiàn)兩位數(shù)的加減乘除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03Android實(shí)現(xiàn)將一個(gè)Activity設(shè)置成窗口樣式的方法
這篇文章主要介紹了Android實(shí)現(xiàn)將一個(gè)Activity設(shè)置成窗口樣式的方法,涉及Android的窗口樣式設(shè)置與布局技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-02-02Android WebView開發(fā)之WebView與Native交互
隨著H5的廣泛使用,Android開發(fā)過程中免不了會(huì)使用網(wǎng)頁來做展示,那么web與native之間的通信就顯得尤其重要了,其實(shí)際上是JavaScript與java之間的通信。本文將為大家詳細(xì)介紹二者是如何實(shí)現(xiàn)交互的,需要的朋友可以參考一下2021-12-12Android編程實(shí)現(xiàn)控件不同狀態(tài)文字顯示不同顏色的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)控件不同狀態(tài)文字顯示不同顏色的方法,涉及Android針對(duì)控件布局文件屬性設(shè)置及狀態(tài)判定等相關(guān)技巧,需要的朋友可以參考下2016-02-02