• android生成分享长图而且加入全图水印


    尊重他人的劳动成果。转载请标明出处:http://blog.csdn.net/gengqiquan/article/details/65938021。 本文出自:【gengqiquan的博客】

    领导近期认为携程的截屏生成长图分享效果比較好,所以我们也加了个。产品认为分享出去的长图须要加公司品牌水印,于是我们也加了个。嗯,事件起因就是这样。
    长图通常是ScrollView和ListView。


    我们须要取得这两个控件的完整显示的图片。

    原理非常easy,搞一张和控件长宽一致的画布(就是创建一个高宽相等的bitmap)。然后调用控件的draw方法把自己画到画布上去。
    分别贴出两个控件的长图获取方法

     /**
         * 截取scrollview的屏幕
         **/
        public static Bitmap getScrollViewBitmap(ScrollView scrollView) {
            int h = 0;
            Bitmap bitmap;
            for (int i = 0; i < scrollView.getChildCount(); i++) {
                h += scrollView.getChildAt(i).getHeight();
            }
            // 创建相应大小的bitmap
    
            bitmap = Bitmap.createBitmap(ScreenUtils.getScreenWidth(scrollView.getContext()), h,
                    Bitmap.Config.ARGB_4444);
            final Canvas canvas = new Canvas(bitmap);
            canvas.drawColor(Color.parseColor("#f2f7fa"));
            scrollView.draw(canvas);
            return bitmap;
        }
    
     /**
         * 截图listview
         **/
        public static Bitmap getListViewBitmap(ListView listView, String picpath) {
            int h = 0;
            Bitmap bitmap;
            // 获取listView实际高度
            for (int i = 0; i < listView.getChildCount(); i++) {
                h += listView.getChildAt(i).getHeight();
            }
    listView.getHeight());
            // 创建相应大小的bitmap
            bitmap = Bitmap.createBitmap(listView.getWidth(), h,
                    Bitmap.Config.RGB_565);
            final Canvas canvas = new Canvas(bitmap);
            canvas.drawColor(Color.WHITE);
            listView.draw(canvas);
            // 測试输出
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(picpath);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            try {
                if (null != out) {
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                    out.flush();
                    out.close();
                }
            } catch (IOException e) {
            }
            return bitmap;
        }
    

    奉送个获取详细view的显示图的方法

    
        /**
         * 生成某个view的图片
         *
         * @author gengqiquan
         * @date 2017/3/20 上午10:34
         */
        public static Bitmap getViewDrawingCacheBitmap(View view) {
            view = view.getRootView();
            if (!view.isDrawingCacheEnabled()) {
                view.setDrawingCacheEnabled(true);
            }
            view.destroyDrawingCache();
            view.buildDrawingCache();
            Bitmap bm = view.getDrawingCache();
            view.setDrawingCacheEnabled(false);
            return bm;
        }

    再奉送个生成某个LinearLayout图片的方法

    /**
         * 生成某个LinearLayout的图片
         *
         * @author gengqiquan
         * @date 2017/3/20 上午10:34
         */
        public static Bitmap getLinearLayoutBitmap(LinearLayout linearLayout) {
            int h = 0;
            // 获取LinearLayout实际高度
            for (int i = 0; i < linearLayout.getChildCount(); i++) {
                linearLayout.getChildAt(i).measure(0, 0);
                h += linearLayout.getChildAt(i).getMeasuredHeight();
            }
            linearLayout.measure(0, 0);
            // 创建相应大小的bitmap
            Bitmap bitmap = Bitmap.createBitmap(linearLayout.getMeasuredWidth(), h,
                    Bitmap.Config.RGB_565);
            final Canvas canvas = new Canvas(bitmap);
            canvas.drawColor(Color.WHITE);
            linearLayout.draw(canvas);
            return bitmap;
        }
    

    完了产品肯定会让你在以下或者上面加上公司的logo图片的。嗯。好人做到低,再送个拼接图片的方法

    /**
    *拼接图片
     * @param first 分享的长图
     * @param second  公司logo图
    *@author gengqiquan
    *@date 2017/3/25 下午4:56
    */
        public static Bitmap add2Bitmap(Bitmap first, Bitmap second) {
            float scale = ((float) first.getWidth()) / second.getWidth();
            second = ImageUtil.scaleImg(second, scale);
            int width = first.getWidth();
            int height = first.getHeight() + second.getHeight();
            Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
            Canvas canvas = new Canvas(result);
            canvas.drawBitmap(first, 0, 0, null);
            canvas.drawBitmap(second, 0, first.getHeight(), null);
            return result;
        }
    

    再来个加入全图水印的方法

    /**
         * @param first 原始图
         * @param mark  水印图
         * @author gengqiquan
         * @date 2017/3/25 下午4:58
         */
         public static Bitmap waterMark(Bitmap first, Bitmap mark) {
            float scale = ((float) first.getWidth()) / mark.getWidth();
            mark = ImageUtil.scaleImg(mark, scale);
            int height = first.getHeight();
            Canvas canvas = new Canvas(first);
            int h = 0;
            while (h < height + mark.getHeight()) {
                canvas.drawBitmap(mark, 0, h, null);
                h = h + mark.getHeight();
            }
            return first;
        }

    坑爹的chrome有bug。一在这个位置点换行接向上按键就崩溃。写个博客崩溃了七八次。近期真的是运气不好。

    事实上我是想说:因为近期被注入了个对象,依赖性比較强。所以这段时间非常少写博客了,后面补上。

    有什么建议的能够留言喔

    假设我的博客对您有帮助。请留言鼓舞下或者点个赞吧!

    我建了一个QQ群(群号:121606151),用于大家讨论交流Android技术问题。有兴趣的能够加下。大家一起进步。

  • 相关阅读:
    Asp.Net MVC4 系列--进阶篇之路由 (2)
    Asp.Net MVC4 系列-- 进阶篇之路由(1)
    ASP.NET MVC AJAX的调用示例
    MVC中Controller控制器相关技术
    MVC中View界面数据呈现示例
    IEnumerable,ICollection,IList,List之间的区别
    Dapper数据库相关操作
    集合类---Map
    工厂模式
    适配器模式与外观模式
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7355979.html
Copyright © 2020-2023  润新知