android 在擷取指定View的時候坑

weixin_34290000發表於2017-10-28

前言
有時我們的需求需要取某一個VIew控制元件中一塊區域,但是截圖這個方法是不可行的,因為截圖是整個螢幕都擷取下來了,而且又沒有達到我們要的效果,我就踩到這個坑了,我是擷取整個螢幕然後把他儲存下來,會導致有點卡頓,有的會沒有,我的很卡。但是今天我又遇到這個需求了,我想要改變一下取View中的區域、同樣是根據View的寬高導致很卡,在有的情況下還不能使用,這個一個很大的問題。以下程式碼是現在我用的擷取view程式碼,在Activity fragment 還是dialog或者PopupWindow都行

/**
*擷取view
**/
  public static Bitmap createViewBitmap(View v) {
        Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(),
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        v.draw(canvas);
        return bitmap;
    }

儲存圖片


  /**
     * @param bitmap
     */
    public static void getBitmap(Bitmap bitmap, String name) {
        if (bitmap != null) {
            try {
                // 獲取內建SD卡路徑
                String sdCardPath = Environment.getExternalStorageDirectory().getPath();
                // 圖片檔案路徑
                String filePath = sdCardPath + File.separator + name;
                imageShare(filePath, 0);
            } catch (Exception e) {
            }
        }
    }

分享微信

 /**
     * 分享圖片
     * @param imgurl 儲存圖片路徑
     * @param sendtype 區分分享到朋友圈還是好友
     */
    public static void imageShare(String imgurl, int sendtype) {
        final IWXAPI api = WXAPIFactory.createWXAPI(App.getInstance(), Constant.WXID, true);
        File file = new File(imgurl);
        if (!file.exists()) {
            RxToast.error("圖片不存在");
        }
        WXImageObject imgObj = new WXImageObject();
        imgObj.setImagePath(imgurl);
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imgObj;
        Bitmap bmp = BitmapFactory.decodeFile(imgurl);
        Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 100, 100, true);
        msg.setThumbImage(thumbBmp);
        bmp.recycle();
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = String.valueOf(System.currentTimeMillis());
        req.message = msg;
        req.scene = sendtype == 0 ? SendMessageToWX.Req.WXSceneSession : SendMessageToWX.Req.WXSceneTimeline;
        api.sendReq(req);
    }

需要用到的直接按照這個上下順序複製就能用

相關文章