91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Android中動態加載二維碼

發布時間:2021-04-15 17:36:53 來源:億速云 閱讀:264 作者:Leah 欄目:移動開發

這篇文章將為大家詳細講解有關怎么在Android中動態加載二維碼,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

1.需求背景

需要實現一個動態加載但不顯示出來的視圖,且該視圖上有個動態生成的二維碼,最后用其去生成一張快照(也就是圖片)。
(常見這種情況是來源于“圖片分享”的功能需求,與普通圖片分享不同在于,該快照圖片是動態加載不顯示的。)

怎么在Android中動態加載二維碼

2.需求功能拆解

  1. 動態二維碼的實現

  2. 動態視圖生成快照的實現

3.踩坑點提要

  1. 獲取不到動態視圖的bitmap

  2. 無法獲取最新動態視圖的bitmap

4.開發實現

動態加載的視圖的布局文件代碼:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:id="@+id/qrcodeContentLl" 
  android:background="#F0E68C" 
  android:orientation="vertical"> 
 
  <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:layout_marginTop="100dp" 
    android:text="二維碼快照" 
    android:textSize="18sp" 
    android:textStyle="italic" /> 
 
  <ImageView 
    android:id="@+id/qrcodeIv" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:layout_gravity="center" 
    android:layout_marginTop="@dimen/activity_vertical_margin" 
    android:scaleType="fitCenter" /> 
 
  <!--<TextView--> 
    <!--android:layout_width="wrap_content"--> 
    <!--android:layout_height="wrap_content"--> 
    <!--android:layout_marginTop="800dp"--> 
    <!--android:text="ahahds"--> 
    <!--android:layout_gravity="center"/>--> 
</LinearLayout>

大概樣式如下:

怎么在Android中動態加載二維碼

(上面的線框是用來顯示動態生成的二維碼圖片的)

a.動態二維碼的實現

關于這塊內容,網上有太多例子了,其實也不用詳解。主要是利用Zxing提供的jar包來進行處理。需要看這塊的詳細代碼可以去文章最后提供的GitHub地址查看,在此只提供下該jar包的資源下載(項目中若只涉及生成二維碼模塊,那么只要core核心jar包即可):點擊下載>> core-3.3.0.jar

b.動態視圖生成快照的實現

private void inflateAndShowCaptureView() { 
   if (hideView == null) { 
     hideView = LayoutInflater.from(this).inflate(R.layout.layout_quick_capture, null); 
     qrcodeIv = (ImageView) hideView.findViewById(R.id.qrcodeIv); 
     hideView.setDrawingCacheEnabled(true);//設置控件允許繪制緩存 
     hideView.measure(View.MeasureSpec.makeMeasureSpec(mainLayoutLl.getWidth(), View.MeasureSpec.EXACTLY), 
         View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
     hideView.layout(0, 0, hideView.getMeasuredWidth(), hideView.getMeasuredHeight()); 
   } else { 
     hideView.destroyDrawingCache();//要得到新的視圖,就得銷毀之前的緩存 
   } 
 
   showCaptureView(); 
 } 
 
 private void showCaptureView() { 
   String content = contentEt.getText().toString().trim(); 
   if (content == null || content.length() == 0) { 
     return; 
   } 
   if (qrcodeIv.getWidth() == 0) { 
     return; 
   } 
   Bitmap qrcodeBitmap = ZXingUtils.createQRImage(content, qrcodeIv.getWidth(), qrcodeIv.getHeight()); 
   qrcodeIv.setImageBitmap(qrcodeBitmap);//先將生成的二維碼顯示在加載的視圖上 
 
   Bitmap bitmap = hideView.getDrawingCache(); // 獲取視圖的繪制緩存(快照) 
   if (bitmap != null) { 
     showIv.setImageBitmap(bitmap); 
   } 
 
 }

1.首先獲取到視圖的bitmap是通過getDrawingCache()得到的。

  1. 若視圖是在界面上直接顯示出來的——>那么使用該方法直接獲取bitmap是沒有問題的;

  2. 若視圖是動態加載且不顯示出來,那么此時獲取bitmap是null。

此處的解決辦法就是手動給該視圖布局:

hideView.measure(View.MeasureSpec.makeMeasureSpec(mainLayoutLl.getWidth(), View.MeasureSpec.EXACTLY), 
    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
hideView.layout(0, 0, hideView.getMeasuredWidth(), hideView.getMeasuredHeight());

以下做點簡單解釋:

View.MeasureSpec.makeMeasureSpec(int size , int mode)中有兩個參數,size和mode,第一組MeasureSpec中我將size設置為了當前顯示頁面的布局的寬度(也就是屏幕寬度),然后mode設置為EXACTLY——>所表示的意義是:給hideView中的子View指定了精確的寬度大小為當前屏幕的寬度。

mode有三種,EXACTLY,AT_MOST,UNSPECIFIED。在上面代碼中,將高度的size指定為0,mode指定為 UNSPECIFIED 則表示——>整個動態加載的視圖高度指定為:依據于最后子View確認的高度。

若將第一組MeasureSpec的相關參數也改為size = 0, mode = UNSPECIFIED,則兩組圖對比顯示如下:

怎么在Android中動態加載二維碼

可以看到,動態生成的快照的寬度也變成了顯示二維碼的ImageView的寬度了。

擴展:如何在寬高均為size = 0 && mode= UNSPECIFIED 的情況下獲取整個屏幕大小的視圖呢?
——>用幾個隱藏的組件埋在視圖的四個邊界,啊哈哈哈哈哈!

關于怎么在Android中動態加載二維碼就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣恩县| 延庆县| 涪陵区| 桂阳县| 苏尼特左旗| 资阳市| 沐川县| 江永县| 遂昌县| 津南区| 渝北区| 大安市| 新乡市| 五原县| 宝兴县| 马公市| 常德市| 石泉县| 安仁县| 金沙县| 徐水县| 兴业县| 东兰县| 类乌齐县| 法库县| 抚远县| 石屏县| 巴林右旗| 嘉荫县| 湖南省| 武城县| 于都县| 友谊县| 淳安县| 麦盖提县| 咸阳市| 西乡县| 常宁市| 兴城市| 新野县| 香河县|