在代碼中合成圖片而後分享

想了半天不知道這篇博客的題目應該叫什麼,不知道怎麼用簡短的句子描述我在開發中碰到的這個問題,那就從頭開始說吧。html

需求是這樣的,要將app中商品的圖片分享到外部,可是分享出去的圖片不僅僅是商品圖片自己,還要帶上分享者和商品的信息,還有咱們app的二維碼等信息,看下圖。android

這個是app內商品的信息
app

這個分享出去後的樣子
ide

應該怎麼作呢?那確定是將這些數據拼裝在一塊兒,可是怎麼拼裝呢?這個很簡單,個人作法是這樣的,在當前佈局視圖下層放一個用戶看不見的 RelativeLayout,背景設置成設計師給的背景,而後將須要的佈局先填充上去,等到拉取到後臺數據後再將相應的數據set上去。但是這些操做都完成後怎麼分享呢?佈局

咱們倒着來想,umeng分享在分享圖片的時候須要的圖片是什麼類型的,this

UMImage image = new UMImage(Context, Bitmap);

看umeng的API知道在構造分享圖片UMImage的時候須要一個 Bitmap 對象,因此咱們須要將剛剛建立好的 RelativeLayout 轉化成 Bitmap 對象spa

Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

佈局的高度和寬度怎麼寫呢?簡單!寫死不就完了。呵呵,若是你這麼想那你就掉到坑裏了,寫死寬高並不能正常的建立Bitmap,最重要的是,在不一樣手機上顯示的圖片真的是慘不忍睹。因此最好的就是將寬高所有設置爲 match_parent 而後再用代碼去得到佈局的寬高。獲取一個視圖的寬高須要用到ViewTreeObserver 關於ViewTreeObserver 能夠參考這篇文章 OnGlobalLayoutListener得到一個視圖的高度設計

具體實現的代碼以下code

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);
                //以後進行分享操做
              }

還有兩個須要注意的地方server

  • 分享的視圖不能gone掉,若是gone掉是不能正常獲取佈局的寬高的,能夠想辦法將其隱藏掉

  • 並非全部用戶都須要分享的,因此不用每次進去都去繪製,能夠在用戶點擊分享按鈕的時候再去繪製須要的部分

完整代碼就不貼了,很簡單,若是有什麼不懂得,能夠聯繫我。

原文地址:http://hedgehog.love/2016/02/28/In-the-code-synthesized-image/轉載請註明出處!

相關文章
相關標籤/搜索