Android截图保存,并分享截图图片,截取ScrollView图片

最近项目需要做一个类似老虎股票的截图分享功能,仔细看了一下这个分享,是截取当前界面显示的内容成图片,并在图片底部拼接上二维码和logo等,最后将图片分享出去,截图如下


screenShotShare.gif

找了一圈,发现安卓截图分享,最常用的方式是截取到当前最顶层view的缓存图片,代码如下

        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap screenShotBm = view.getDrawingCache();
        view.destroyDrawingCache();//注意,这里需要释放缓存

用个ImageView,set一下,就能看到,这个screenShotBm就是我们刚才截取的这个屏幕的图片,需要注意的是,这个截图是包含了状态栏高度的,如果不需要可以减去这个状态栏高度

 private Bitmap drawComBitmap(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);// 允许当前窗口保存缓存信息,这样getDrawingCache()方法才会返回一个Bitmap
        if (null != view) {
            //获取顶部的bitmap
            int width = view.getMeasuredWidth();
            int statusBarHeight = getStatusBarHeight(activity);
            //去掉状态栏和导航栏的高度
            int height = view.getMeasuredHeight() - getNavigationBarHeight(activity) - statusBarHeight;
            //拼接图片
            Bitmap logoBitmap = BitmapFactory.decodeResource(activity.getResources(), R.drawable.screenshot_logo);
            Bitmap codeBitmap = BitmapFactory.decodeResource(activity.getResources(), R.drawable.screenshot_code);
            int logoHeight = logoBitmap.getHeight();
            int codeHeight = codeBitmap.getHeight();
            int codeWidth = codeBitmap.getWidth();
            mDefaultLogoBgHeight = logoHeight * 2;
            mBgHeight = height - mDefaultLogoBgHeight;
            Bitmap drawingCache = view.getDrawingCache();
            Bitmap topBitmap = Bitmap.createBitmap(drawingCache, 0, statusBarHeight, width, height);
            //绘制原始图片
            mNewb = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
            Canvas canvas = new Canvas(mNewb);
            canvas.drawBitmap(topBitmap, 0, 0, null);
            //绘制底部背景
            canvas.drawRect(0, height, width, mBgHeight, mBitPaint);
            //绘制二维码和logo
            canvas.drawBitmap(logoBitmap, mDefaultMargin, (height - mDefaultLogoBgHeight / 2) - logoHeight / 2, null);
            canvas.drawBitmap(codeBitmap, width - codeWidth - mDefaultMargin, (height - mDefaultLogoBgHeight / 2) - codeHeight / 2, null);
            canvas.save(Canvas.ALL_SAVE_FLAG);
            canvas.restore();
            //释放资源
            view.destroyDrawingCache();
            drawingCache.recycle();
            logoBitmap.recycle();
            codeBitmap.recycle();
            topBitmap.recycle();
        }
        return mNewb;
    }

最后就是分享,调用分享(友盟),将此图片分享出去

第二种,截取ScrollView图片,并分享

这种截图稍微复杂一点,但是也没有特别复杂
首先看一下效果,是将一段文字添加到某张图片中,并将图片底部添加二维码和logo最终分享出去
我理解的之所以是用ScrollView,是因为中间的文字是可多可少的,文字长了,整个页面就是可以滑动的


screenshot.gif

首先看一下ScrollView的截图方式,ScrollView截图最重要的一点就是正确获取到整个ScrollView的真实高度

public Bitmap getScrollScreenShot(ScrollView view) {
        if (null != view) {
            int height = 0;
            //正确获取ScrollView
            for (int i = 0; i < view.getChildCount(); i++) {
                height += view.getChildAt(i).getHeight();
            }
            if (height > 0) {
                //创建保存缓存的bitmap
                Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), height, Bitmap.Config.RGB_565);
                //可以简单的把Canvas理解为一个画板 而bitmap就是块画布
                Canvas canvas = new Canvas(bitmap);
                //把view的内容都画到指定的画板Canvas上
                view.draw(canvas);
                return bitmap;
            }
        }

        return null;
    }

至于内容的拼接,有两种思考方式
第一种是使用Canvas去画,这个画的话就需要准确的计算顶部标题,时间,以及底部logo和二维码的正确坐标,调用API进行draw就可以了
第二种是使用layout布局,这里主要使用第二种方式

       public Bitmap sheareScroll() {
        ViewGroup rootView = findViewById(android.R.id.content);
        View inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_screen_short, null);
        rootView.addView(inflate, 0);
        final ScrollView scrollView = inflate.findViewById(R.id.scrollView);
        inflate.post(new Runnable() {
            @Override
            public void run() {
                mScrollScreenShot = getScrollScreenShot(scrollView);
               
            }
        });

        return mScrollScreenShot;
    }

这里要注意的几点

  1. android.R.id.content 这个东西想必不陌生,它是一个FrameLayout,我们在任何一个窗口(界面),拿到它的最底层view,即DecorView,其实就是这个FrameLayout
  2. 使用LayoutInflater将这个layout加载出来,得到这个包含布局的view,这里该设置数据的设置数据,该获取id的获取id,这个R.layout.activity_screen_short布局中就是截图中显示的布局,包含顶部的标题,时间戳,以及内容布局,logo,二维码等
  3. rootView.addView(inflate, 0); 这里是很巧妙的一个做法,将inflate到的这个view添加到当前这个窗口的最底层,相当于手动动态的给当前的界面在最底层添加了一个布局进去,由于这个rootView是个FrameLayout,上层被内容遮挡,我们看不到这个添加到最底层的layout,最后截图的时候,就截这个添加进去的inflate这个view中的scrollView就可以了.

最后就是分享这个截图的Bitmap就行了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266