仿抖音短視頻APP源碼截取View爲圖片

截取View轉爲圖片的方法

  private static Bitmap convertViewToBitmap(View tempView) {
      /**
       * 創建一個bitmap放於畫布之上進行繪製 (簡直如有神助)
       */
        Bitmap bitmap = Bitmap.createBitmap(tempView.getWidth(),
                tempView.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        tempView.draw(canvas);
        return bitmap;
    }

MainActivity

package com.example.viewtobitmap;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;

/**
 * @author Mr.Liu
 * */
public class MainActivity extends Activity {
    private LinearLayout tempview;
    private ImageView mView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //我們要截取的View
        tempview = (LinearLayout) findViewById(R.id.gone_view);
        //用於展示我們已截取View的承載視圖
        mView = (ImageView) findViewById(R.id.img);

        //點擊事件
        findViewById(R.id.changeviewtobitmap).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //屏幕參數
                //Display disPlay = getWindowManager().getDefaultDisplay();
                mView.setImageBitmap(convertViewToBitmap(tempview, null));
            }
        });
    }

    /**
     * 主要方法:創建一個bitmap放於畫布之上進行繪製 (簡直如有神助)
     */
    private static Bitmap convertViewToBitmap(View tempView, Display disPlay) {
        Bitmap bitmap = Bitmap.createBitmap(tempView.getWidth(),
                tempView.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        tempView.draw(canvas);
        return bitmap;
    }
}

MainActivity Xml

<LinearLayout
    android:id="@+id/gone_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ff0"
    android:orientation="vertical"
    android:paddingBottom="10dp"
    android:visibility="visible">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:text="你是我患得患失的夢,我是你可有可無的人~~"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:text="畢竟這穿越山河的箭,刺的都是用情致疾的人~~"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:text="畢竟這穿越山河的箭,刺的都是用情致疾的人~~"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:text="就讓這牽腸掛肚的酒,硫酸一樣刺激在你我的心頭~~"/>
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="50dp"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="4dp">

    <Button
        android:id="@+id/changeviewtobitmap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="截View視圖"/>
</LinearLayout>

<ImageView
    android:id="@+id/img"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

項目代碼

RxPermissions rxPermissions = new RxPermissions(this);
            //Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA 文件存儲權限、相機權限
            rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE, 		Manifest.permission.CAMERA).subscribe(new Observer<Boolean>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(Boolean aBoolean) {
                    //有權限的狀態
                    if (aBoolean) {
                        Display displayQQ = getWindowManager().getDefaultDisplay();
                        UMImage umImageQQ = new UMImage(InviteAwardActivity.this, convertViewToBitmap(mSharePicture, displayQQ));
                       /* 便於找到自身錯誤
                        if (thumbImage == null) {
                            ToastUtils.shortShow("分享圖片爲空");
                        }*/
                        umImageQQ.setThumb(umImageQQ);
                        boolean qqClientAvailable = PlatformUtil.isQQClientAvailable(InviteAwardActivity.this);
                        if (qqClientAvailable) {
                            new ShareAction(InviteAwardActivity.this)
                                    .setPlatform(SHARE_MEDIA.QQ)
                                    .withMedia(umImageQQ)
                                    .setCallback(new UMShareListener() {
                                        @Override
                                        public void onStart(SHARE_MEDIA shareMedia) {

                                        }

                                        @Override
                                        public void onResult(SHARE_MEDIA shareMedia) {
                                            ToastUtils.shortShow("分享成功!");
                                        }

                                        @Override
                                        public void onError(SHARE_MEDIA shareMedia, Throwable throwable) {

                                        }

                                        @Override
                                        public void onCancel(SHARE_MEDIA shareMedia) {

                                        }
                                    }).share();
                        } else {
                            ToastUtils.shortShow("請安裝QQ客戶端");
                        }
                    }
                    //無權限的狀態
                    else {
                        Toast.makeText(InviteAwardActivity.this, getString(R.string.picture_jurisdiction), Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });

擴展方法
以下內容 : 我認爲可以先行忽略,不過也可以看看,畢竟是看了十幾篇類似博文的產物 ~

方式一 :

圖片壓縮、View轉換

 /**
     * 壓縮圖片
     *
     * @param bgimage
     * @param newWidth
     * @param newHeight
     * @return
     */
    public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) {
        // 獲取這個圖片的寬和高
        float width = bgimage.getWidth();
        float height = bgimage.getHeight();
        // 創建操作圖片用的matrix對象
        Matrix matrix = new Matrix();
        // 計算寬高縮放率
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // 縮放圖片動作
        //matrix.postScale(scaleWidth, scaleHeight);//TODO 因爲寬高不確定的因素,所以不縮放
        Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,
                (int) height, matrix, true);
        return bitmap;
    }

	/**
     * 截取指定View爲圖片
     *
     * @param view
     * @return
     * @throws Throwable
     */
    public static Bitmap captureView(View view) throws Throwable {
        Bitmap bm = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        view.draw(new Canvas(bm));
        return bm;
    }

壓縮使用

Bitmap bitmap = null;
  try {
         bitmap = captureView(mShareBackgroundSign);
      } catch (Throwable throwable) {
            throwable.printStackTrace();
      }
   //圖片壓縮,加快使用速度~
   zoomImage(bitmap, 720, 1280);

圖片保存到本地 (若要保存,務必記得權限申請)

public static void savePhotoToSDCard(Bitmap photoBitmap, String path, String photoName) {
        if (checkSDCardAvailable()) {
            File dir = new File(path);
            if (!dir.exists()) {
                dir.mkdirs();
            }
 
            File photoFile = new File(path, photoName + ".png");
            FileOutputStream fileOutputStream = null;
            try {
                fileOutputStream = new FileOutputStream(photoFile);
                if (photoBitmap != null) {
                    if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) {
                        fileOutputStream.flush();
                    }
                }
            } catch (FileNotFoundException e) {
                photoFile.delete();
                e.printStackTrace();
            } catch (IOException e) {
                photoFile.delete();
                e.printStackTrace();
            } finally {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

方式二 (有人說截取view轉bitmap後爲null~ 用這種方式清理緩存) :

public static Bitmap getViewBp(View v) {
    if (null == v) {
        return null;
    }
    v.setDrawingCacheEnabled(true);
    v.buildDrawingCache();
    if (Build.VERSION.SDK_INT >= 11) {
        v.measure(View.MeasureSpec.makeMeasureSpec(v.getWidth(),
                View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(
                v.getHeight(), View.MeasureSpec.EXACTLY));
        v.layout((int) v.getX(), (int) v.getY(),
                (int) v.getX() + v.getMeasuredWidth(),
                (int) v.getY() + v.getMeasuredHeight());
    } else {
        v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
    }
    Bitmap b = Bitmap.createBitmap(v.getDrawingCache(), 0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

    v.setDrawingCacheEnabled(false);
    v.destroyDrawingCache();
    return b;
}

方式三 (有人說截取view轉bitmap後爲null~ 用這種方式清理緩存):

	public static Bitmap convertViewToBitmap(View view) {
        view.setDrawingCacheEnabled(true);
        view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        view.buildDrawingCache();
        Bitmap bitmap = view.getDrawingCache();
        view.setDrawingCacheEnabled(false);
        return bitmap;
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章