Android手机截屏生成gif图片

30 篇文章 1 订阅

PS:我后来发现了个更好用的工具:robogif,原理应该跟我的思路是一样的:先录屏再转换。我尝试了在win7下没有跑成功,需要在ubuntu或者mac下跑。https://github.com/izacus/RoboGif


经常看到GitHub或者csdn论坛路面的android示例文章都带有gif的演示图片,这个手机屏幕gif图片是怎么制作的呢?

大家最先想到的肯定是各种手机助手,下面给大家总结一下我的经验:

1. 应用宝的动态截屏功能,需要你手动截取一张图一张图,然后应用帮生成gif图片,问题生成出来的gif图片是流畅度太差,而且手机的点击、切换效果也不能很好的显示出来。

2. 360手机助手、豌豆荚等手机助手的屏幕播放功能,播放然后电脑录屏,再生成gif,这个方法理论上是可行的,但是实际情况是屏幕播放卡出翔了,界面的切换根本就没有过渡效果(我猜测实际上也是一屏一屏去截取的)。

3. 我目前使用的方法,录屏+转换:

步骤1:使用命令screenrecord(Android4.4版本以上)录屏:

             adb shell screenrecord /sdcard/demo.mp4  --size 1080x1920 --time-limit 10

这里设置的是1080x1920是你的手机的分辨率,控制10秒的时长,主要是从视频质量和大小进行考量,视频源的大小和质量同时也会影响到接下来gif生成的质量(gif图片的大小最好控制在1M以下).

注意,这个命令限制了最大录制时长为180秒,这对于录制制作gif图片的视频源来说足够了。

步骤2:导出视频到本地:adb pull /sdcard/demo.mp4

步骤3:使用免费的视频转换工具Free Video to GIF Converter讲视频文件转换为gif图片


工具下载地址:http://download.csdn.net/detail/olevin/9578495

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 用Kotlin语言来编写Android手机截屏代码,可以参考以下代码: val bitmap = getScreenShot() val imagePath = saveBitmap(bitmap) fun getScreenShot(): Bitmap { val view = getWindow().getDecorView() view.isDrawingCacheEnabled = true val bitmap = Bitmap.createBitmap(view.getDrawingCache()) view.isDrawingCacheEnabled = false return bitmap } fun saveBitmap(bitmap: Bitmap): String { val fileName = "${System.currentTimeMillis()}.png" val imagePath = getExternalFilesDir(Environment.DIRECTORY_PICTURES).toString() + File.separator + fileName val file = File(imagePath) val outputStream = FileOutputStream(file) bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) outputStream.flush() outputStream.close() return imagePath } ### 回答2: 在Kotlin中编写Android手机截屏代码可以使用`MediaProjectionManager`和`ImageReader`来实现。以下是一个简单的示例代码: ```kotlin // 在Activity中创建MediaProjectionManager和ImageReader的实例 val mediaProjectionManager = getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager val imageReader = ImageReader.newInstance(screenWidth, screenHeight, PixelFormat.RGBA_8888, 2) // 请求屏幕捕获权限 startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), REQUEST_CODE) // 在onActivityResult中获取屏幕捕获权限 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) { val mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data) // 创建一个VirtualDisplay来捕获屏幕内容 val virtualDisplay = mediaProjection.createVirtualDisplay( "ScreenCapture", screenWidth, screenHeight, resources.displayMetrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, imageReader.surface, null, null ) // 创建一个ImageReader.OnImageAvailableListener来获取截屏图像 imageReader.setOnImageAvailableListener({ reader -> val image = reader.acquireLatestImage() // 处理截屏图像 // ... image?.close() }, null) // 停止屏幕捕获 virtualDisplay.release() mediaProjection.stop() } } ``` 上述代码监听了`ImageReader`的`setOnImageAvailableListener`,当有新的图像可用时会调用该方法,并在其中获取并处理截屏图像。需要注意的是截屏图像的处理在主线程中进行,如果图像处理较为耗时,建议将处理逻辑放在异步线程中执行。 ### 回答3: 在Kotlin中编写Android手机截屏代码可以通过以下步骤: 1. 首先,在AndroidManifest.xml文件中添加必要的权限: ``` <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 创建一个名为ScreenCaptureUtil的辅助类,并添加一个名为captureScreen的静态方法: ```kotlin object ScreenCaptureUtil { @JvmStatic fun captureScreen(activity: Activity): Bitmap? { // 获取屏幕视图 val view = activity.window.decorView view.isDrawingCacheEnabled = true // 创建Bitmap并从视图绘制上面 val screenshot = Bitmap.createBitmap(view.drawingCache) view.isDrawingCacheEnabled = false return screenshot } } ``` 3. 在需要截屏的Activity中调用ScreenCaptureUtil的captureScreen方法: ```kotlin val screenshot = ScreenCaptureUtil.captureScreen(this) if (screenshot != null) { // 将截图写入文件存储 val file = File(Environment.getExternalStorageDirectory().toString() + "/screenshot.jpg") try { val fos = FileOutputStream(file) screenshot.compress(Bitmap.CompressFormat.JPEG, 100, fos) fos.flush() fos.close() // 在本地保存截图 MediaStore.Images.Media.insertImage(contentResolver, file.absolutePath, "screenshot", "screenshot") } catch (e: Exception) { e.printStackTrace() } } ``` 上述代码首先获取当前Activity的视图对象,开启视图的绘图缓存,并将视图绘制到一个新的Bitmap对象中。然后,将Bitmap对象保存为JPEG格式的文件,并将其插入到系统的媒体库中,以便在图库或其他应用程序中查看截图。 请注意,为了确保应用程序具有写入外部存储的权限,还需要在Manifest文件中添加相应的权限。+

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值