android異步生成圖片

下面來說說在Android上如果異步生成圖片,通過xml布局用View排版好圖片樣式,在子線程生成一張圖片,以滿足生成用來分享的圖片等需求(生成圖片前設置可變元素,如用戶的頭像,昵稱等)。

效果

  • 點擊按鈕生成圖片:


    pic_generate.gif

特性

  • 通過布局和View的方式設計圖片樣式。
  • 在子線程中生成和保存圖片。
  • 封裝好工具類,直接使用即可。

核心代碼

    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流程,把布局展示的界面畫到我們準備好的bitmap上(這一過程可在非UI線程完成),再把bitmap保存在文件或顯示到界面上。

  1. 在布局中寫好圖片的樣子,然后把布局inflate成View,當然也可以直接代碼編寫View,設置好里面的可變元素,如頭像,昵稱等。
  2. 通過調用View的measure,layout方法使之測量出內部各控件的大小和排列好各控件。
  3. 創(chuàng)建一個和View大小相同的空Bitmap,新建一個畫布傳入該bitamp(new Canvas(bitmap)),調用view的draw(canvas)方法,view會把圖片繪制在該bitmap上。
  4. 保存到文件或直接使用圖片。

使用方法

  1. 在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>
    
  2. 寫一個自己的Model繼承自GenerateModel,設置可變元素并使用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);
                }
            });
        }
    

源碼地址:

作者:竹塵居士
公眾號:竹塵居 (zhuchenju92)
Github:https://github.com/homgwu/picgenerator
博客:http://zhuchen.vip/2018/04/13/android/android-pic-generator.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,169評論 25 708
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,358評論 0 17
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,889評論 2 45
  • 春天剛剛走開 夏綠就輕輕的來 我正待歡呼 而你 卻要遠行 知道嗎 起風了 或許 你要走了 不是今夜 你要走了 不再...
    賽騰煙閱讀 439評論 2 10
  • 夜景很美,一瞬間思緒又不知道飄到了哪里。想想,人的一生所付出的所有努力都只是為了能在這棟高樓里擁有自己的一席...
    含三葉閱讀 468評論 0 0

友情鏈接更多精彩內容