PS:這個(gè)方法很挫,沒有什么參考價(jià)值椿浓,不要看了
想了半天不知道這篇博客的題目應(yīng)該叫什么纬黎,不知道怎么用簡短的句子描述我在開發(fā)中碰到的這個(gè)問題幅骄,那就從頭開始說吧。
需求是這樣的本今,要將app中商品的圖片分享到外部拆座,但是分享出去的圖片不單單是商品圖片本身,還要帶上分享者和商品的信息诈泼,還有我們app的二維碼等信息懂拾,看下圖。
這個(gè)是app內(nèi)商品的信息
這個(gè)分享出去后的樣子
應(yīng)該怎么做呢铐达?那肯定是將這些數(shù)據(jù)拼裝在一起岖赋,但是怎么拼裝呢?這個(gè)很簡單瓮孙,我的做法是這樣的唐断,在當(dāng)前布局視圖下層放一個(gè)用戶看不見的 RelativeLayout,背景設(shè)置成設(shè)計(jì)師給的背景选脊,然后將需要的布局先填充上去,等到拉取到后臺(tái)數(shù)據(jù)后再將相應(yīng)的數(shù)據(jù)set上去脸甘】疑叮可是這些操作都完成后怎么分享呢?
我們倒著來想丹诀,umeng分享在分享圖片的時(shí)候需要的圖片是什么類型的钝的,
UMImage image = new UMImage(Context, Bitmap);
看umeng的API知道在構(gòu)造分享圖片UMImage的時(shí)候需要一個(gè) Bitmap 對(duì)象,所以我們需要將剛剛創(chuàng)建好的 RelativeLayout 轉(zhuǎn)化成 Bitmap 對(duì)象
Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
布局的高度和寬度怎么寫呢铆遭?簡單硝桩!寫死不就完了。呵呵枚荣,如果你這么想那你就掉到坑里了碗脊,寫死寬高并不能正常的創(chuàng)建Bitmap,最重要的是橄妆,在不同手機(jī)上顯示的圖片真的是慘不忍睹衙伶。所以最好的就是將寬高全部設(shè)置為 match_parent 然后再用代碼去獲得布局的寬高。獲取一個(gè)視圖的寬高需要用到ViewTreeObserver 關(guān)于ViewTreeObserver 可以參考這篇文章 OnGlobalLayoutListener獲得一個(gè)視圖的高度
具體實(shí)現(xiàn)的代碼如下
ViewTreeObserver vto = v.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
v.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int width = v.getMeasuredWidth();
int height = v.getMeasuredHeight();
final Bitmap bb = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bb);
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
v.draw(c);
final UMImage image = new UMImage(NewProductActivity.this, bb);
//之后進(jìn)行分享操作
}
還有兩個(gè)需要注意的地方
- 分享的視圖不能gone掉害碾,如果gone掉是不能正常獲取布局的寬高的矢劲,可以想辦法將其隱藏掉
- 并不是所有用戶都需要分享的,所以不用每次進(jìn)去都去繪制蛮原,可以在用戶點(diǎn)擊分享按鈕的時(shí)候再去繪制需要的部分
完整代碼就不貼了卧须,很簡單,如果有什么不懂得儒陨,可以聯(lián)系我花嘶。
原文地址:http://hedgehog.love/2016/02/28/In-the-code-synthesized-image/ 轉(zhuǎn)載請(qǐng)注明出處!