返回顶部
首页 > 资讯 > 精选 >Android截屏和指定View生成截图的示例分析
  • 485
分享到

Android截屏和指定View生成截图的示例分析

2023-06-15 10:06:18 485人浏览 安东尼
摘要

这篇文章主要为大家展示了“Android截屏和指定View生成截图的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android截屏和指定View生成截图的示例分析”这篇文章吧。当前页面

这篇文章主要为大家展示了“Android截屏和指定View生成截图的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android截屏和指定View生成截图的示例分析”这篇文章吧。

当前页面截图(截取整个屏幕)

截取当前Activity页面的截图,可以通过窗体最底层的decorView进行缓存,然后根据这个缓存对象生成一张图片。有的需要不需要状态栏,也可以指定生成图片的宽高,把状态栏去除。

fun captureWindow(activity: Activity, isshowStatusBar: Boolean): Bitmap? {    // 获取当前窗体的View对象    val view = activity.window.decorView    view.isDrawinGCacheEnabled = true    // 生成缓存    view.buildDrawingCache()    val bitmap = if (isShowStatusBar) {        // 绘制整个窗体,包括状态栏        Bitmap.createBitmap(view.drawingCache, 0, 0, view.measuredWidth, view.measuredHeight)    } else {        // 获取状态栏高度        val rect = Rect()        view.getWindowVisibleDisplayFrame(rect)        val display = activity.windowManager.defaultDisplay        // 减去状态栏高度        Bitmap.createBitmap(view.drawingCache, 0,                rect.top, display.width, display.height - rect.top)    }    view.isDrawingCacheEnabled = false    view.destroyDrawingCache()    return bitmap}

截取常用的View

截取之前一定要View已经绘制完毕了,所以要注意使用post方法确保View绘制完毕。有的分享出去的截图页面并不是当前展示给用户的UI样式,所以可以在当前布局中隐藏一个容器,专门用来存放截图,这个容器不展示给用户。

fun captureView(view: View): Bitmap? {        view.isDrawingCacheEnabled = true        view.buildDrawingCache()        // 重新测量一遍View的宽高        view.measure(View.MeasureSpec.makeMeasureSpec(view.width, View.MeasureSpec.EXACTLY),                View.MeasureSpec.makeMeasureSpec(view.height, View.MeasureSpec.EXACTLY))        // 确定View的位置        view.layout(view.x.toInt(), view.y.toInt(), view.x.toInt() + view.measuredWidth,                view.y.toInt() + view.measuredHeight)        // 生成View宽高一样的Bitmap        val bitmap = Bitmap.createBitmap(view.drawingCache, 0, 0, view.measuredWidth,                view.measuredHeight)        view.isDrawingCacheEnabled = false        view.destroyDrawingCache()        return bitmap}

截取ScrollView

ScrollView截图的难点在于ScrollView高度不确定,如果能确定高度,就可以使用ScrollView的缓存生成图片。ScrollView只有一个子View,所以只需要对子View进行测量,获取到子View的高度就可以确定ScrollView的高度。

fun captureScrollView(scrollView: ScrollView): Bitmap? {     var h = 0     for (i in 0 until scrollView.childCount) {         val childView = scrollView.getChildAt(i)         // 获取子View的高度         h += childView.height         // 设置背景颜色,避免布局里未设置背景颜色,截的图背景黑色         childView.setBackgroundColor(Color.parseColor("#FFFFFF"))     }     val bitmap = createBitmap(scrollView.width, h)     val canvas = Canvas(bitmap)     // 将ScrollView绘制在画布上     scrollView.draw(canvas)     return bitmap}

截取ListView

ListView截图原理是获取到每一个子View的Bitmap对象,然后根据子View的高度,使用Paint将子View的截图拼接绘制到Canvas上,最后生成一张包含所有子View的截图。

fun captureListView(listView: ListView): Bitmap? {        val adapter = listView.adapter        val itemCount = adapter.count        var allitemsheight = 0        val bitmaps = ArrayList<Bitmap>()        for (i in 0 until itemCount) {            // 获取每一个子View            val childView = adapter.getView(i, null, listView)            // 测量宽高            childView.measure(                    View.MeasureSpec.makeMeasureSpec(listView.width, View.MeasureSpec.EXACTLY),                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))            // 布局位置            childView.layout(0, 0, childView.measuredWidth, childView.measuredHeight)            // 设置背景颜色,避免是黑色的            childView.setBackgroundColor(Color.parseColor("#FFFFFF"))            childView.isDrawingCacheEnabled = true            // 生成缓存            childView.buildDrawingCache()            // 将每一个View的截图加入集合            bitmaps.add(childView.drawingCache)            // 叠加截图高度            allitemsheight += childView.measuredHeight        }        // 创建和ListView宽高一样的画布        val bitmap = createBitmap(listView.measuredWidth, allitemsheight)        val canvas = Canvas(bitmap)        val paint = Paint()        var iHeight = 0f        for (i in bitmaps.indices) {            val bmp: Bitmap = bitmaps[i]            // 将每一个生成的bitmap绘制在画布上            canvas.drawBitmap(bmp, 0f, iHeight, paint)            iHeight += bmp.height            bmp.recycle()        }        return bitmap}

截取RecyclerView

RecyclerView截图和ListView截图原理一样,都是将子View的截图进行拼接,最后生成一张大的截图。

fun captureRecyclerView(recyclerView: RecyclerView): Bitmap? {        val adapter = recyclerView.adapter        var bigBitmap: Bitmap? = null        if (adapter != null) {            val size = adapter.itemCount            var height = 0            val paint = Paint()            var iHeight = 0            val maxMemory = (Runtime.getRuntime().maxMemory() / 1024).toInt()            // Use 1/8th of the available memory for this memory cache.            val cacheSize = maxMemory / 8            val bitmapCache = LruCache<String, Bitmap>(cacheSize)            for (i in 0 until size) {                val holder = adapter.createViewHolder(recyclerView, adapter.getItemViewType(i))                adapter.onBindViewHolder(holder, i)                holder.itemView.measure(                        View.MeasureSpec.makeMeasureSpec(recyclerView.width, View.MeasureSpec.EXACTLY),                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))                holder.itemView.layout(0, 0, holder.itemView.measuredWidth,                        holder.itemView.measuredHeight)                holder.itemView.setBackgroundColor(Color.parseColor("#FFFFFF"))                holder.itemView.isDrawingCacheEnabled = true                holder.itemView.buildDrawingCache()                val drawingCache = holder.itemView.drawingCache                if (drawingCache != null) {                    bitmapCache.put(i.toString(), drawingCache)                }                height += holder.itemView.measuredHeight            }            bigBitmap = createBitmap(recyclerView.measuredWidth, height)            val bigCanvas = Canvas(bigBitmap!!)            val lBackground = recyclerView.background            if (lBackground is ColorDrawable) {                val lColor = lBackground.color                bigCanvas.drawColor(lColor)            }            for (i in 0 until size) {                val bitmap = bitmapCache.get(i.toString())                bigCanvas.drawBitmap(bitmap, 0f, iHeight.toFloat(), paint)                iHeight += bitmap.height                bitmap.recycle()            }        }        return bigBitmap}

截取WEBView

WebView可以加载很长很复杂的页面,所以进行截图很容易发生内存溢出,不过一般的需求也不会有那个大的图片去分享,这里只做简单的截图。

fun captureWebView(webView: WebView): Bitmap? {        //&emsp;重新调用WebView的measure方法测量实际View的大小(将测量模式设置为UNSPECIFIED模式也就是需要多大就可以获得多大的空间)        webView.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))        //&emsp;调用layout方法设置布局(使用新测量的大小)        webView.layout(0, 0, webView.measuredWidth, webView.measuredHeight)        //&emsp;开启WebView的缓存(当开启这个开关后下次调用getDrawingCache()方法的时候会把view绘制到一个bitmap上)        webView.isDrawingCacheEnabled = true        //&emsp;强制绘制缓存(必须在setDrawingCacheEnabled(true)之后才能调用,否者需要手动调用destroyDrawingCache()清楚缓存)        webView.buildDrawingCache()        val bitmap = createBitmap(webView.measuredWidth, webView.measuredHeight)        //&emsp;已picture为背景创建一个画布        val canvas = Canvas(bitmap)  // 画布的宽高和 WebView 的网页保持一致        val paint = Paint()        //&emsp;设置画笔的定点位置,也就是左上角        canvas.drawBitmap(bitmap, 0f, webView.measuredHeight * 1f, paint)        //&emsp;将WebView绘制在刚才创建的画板上        webView.draw(canvas)        webView.isDrawingCacheEnabled = false        webView.destroyDrawingCache()        return bitmap}

基本常用的View都可以进行截图,但是像WebView这种可以加载很长很复杂页面的控件,截图容易发生OOM,所以要考虑好用什么控件进行截图。上面的代码亲测都可以使用。

以上是“Android截屏和指定View生成截图的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android截屏和指定View生成截图的示例分析

本文链接: https://lsjlt.com/news/279707.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android截屏和指定View生成截图的示例分析
    这篇文章主要为大家展示了“Android截屏和指定View生成截图的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android截屏和指定View生成截图的示例分析”这篇文章吧。当前页面...
    99+
    2023-06-15
  • 浅谈Android截屏和指定View生成截图
    目录当前页面截图(截取整个屏幕)截取常用的View截取ScrollView截取ListView截取RecyclerView截取WebView当前页面截图(截取整个屏幕) 截取当前Ac...
    99+
    2024-04-02
  • Android屏幕及view的截图实例详解
    Android屏幕及view的截图实例详解屏幕可见区域的截图 整个屏幕截图的话可以用View view = getWindow().getDecorView();public static Bitmap getNormalViewScree...
    99+
    2023-05-31
    android view截图 roi
  • Android Webview拦截ajax请求的示例分析
    小编给大家分享一下Android Webview拦截ajax请求的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h6的ajax请求并没有提供...
    99+
    2023-05-30
  • 如何分析C++实现功能齐全的屏幕截图示例
    如何分析C++实现功能齐全的屏幕截图示例,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。屏幕截图已经成为了所有IM即时通讯软件的必备模块,也是日常办公中使用最频繁...
    99+
    2023-06-25
  • Android 获取浏览器当前分享页面的截屏示例
    今天在项目中碰见这么一个需求:获取 Chrome 浏览器分享时,页面的截屏。静下来一想,既然是分享,那么肯定得通过 Intent 来传递数据,如果真的能获取到 Chrome 分...
    99+
    2022-06-06
    浏览器 示例 Android
  • 使用Android实现截图和分享功能的案例
    这篇文章主要介绍了使用Android实现截图和分享功能的案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。先给大家展示下效果图吧直接上代码:xml的布局:<Button...
    99+
    2023-05-30
    android
  • android中自定义View之复合控件的示例分析
    这篇文章给大家分享的是有关android中自定义View之复合控件的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。复合控件可以很好地创建出具有重用功能的控件集合。很多的APP都有一些共通的UI界面,为了统...
    99+
    2023-06-15
  • Android原生项目集成React Native的示例分析
    小编给大家分享一下Android原生项目集成React Native的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!开发环境准备首先按照开发环境搭建教程来安装React Native在安卓平台上所需的一切依赖软件(...
    99+
    2023-05-30
    android react native
  • 二维码图片生成器QRCode.js的示例分析
    这篇文章给大家分享的是有关二维码图片生成器QRCode.js的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。QRCode.js是一个实现生成二维码(QRCode)的js插...
    99+
    2024-04-02
  • SpringBoot2中多个拦截器配置和使用场景的示例分析
    这篇文章主要为大家展示了“SpringBoot2中多个拦截器配置和使用场景的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot2中多个拦截器配置和使用场景的示例分析”这篇...
    99+
    2023-06-02
  • 微信小程序中movable view移动图片和双指缩放的示例分析
    这篇文章主要为大家展示了“微信小程序中movable view移动图片和双指缩放的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序中movabl...
    99+
    2024-04-02
  • Android studio中JNI编程实例并生成so库的示例分析
    这篇文章主要为大家展示了“Android studio中JNI编程实例并生成so库的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android studio中JNI编程实例并生成so库...
    99+
    2023-05-30
    android studio
  • Laravel自定义Make命令生成Service类的示例分析
    这篇文章主要介绍Laravel自定义Make命令生成Service类的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Laravel 是什么Laravel 是一套简洁、优雅的PHP Web开发框架。它可以让你从...
    99+
    2023-06-15
  • Android中自定义view中事件分发机制与处理的示例分析
    这篇文章将为大家详细讲解有关Android中自定义view中事件分发机制与处理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。题引事件只有一个,多个人想要处理,处理的对象不是我们想给的对象就是事件...
    99+
    2023-06-25
  • JS中正则截取替换特定字符之间字符串的示例分析
    这篇文章主要介绍了JS中正则截取替换特定字符之间字符串的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:示例1:<!D...
    99+
    2024-04-02
  • JS生成唯一id方式之UUID和NanoID的示例分析
    这篇文章给大家分享的是有关JS生成唯一id方式之UUID和NanoID的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、为什么 NanoID 正在取代 UUID.更安全 在大多数随机生成器中,它们使用不...
    99+
    2023-06-22
  • CSS3中linear-gradient线性渐变生成加号和减号的示例分析
    这篇文章主要为大家展示了“CSS3中linear-gradient线性渐变生成加号和减号的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS3中lin...
    99+
    2024-04-02
  • Android学习之Intent中显示意图和隐式意图的用法实例分析
    本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法。分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯...
    99+
    2022-06-06
    android学习 示意图 intent Android
  • JavaScript中字符串数字左补位,右补位,取固定长度,截位扩展函数的示例分析
    这篇文章主要介绍了JavaScript中字符串数字左补位,右补位,取固定长度,截位扩展函数的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作