Android中如何录制Activity内特定布局的视频?
当然有靠谱的实现方法啦!针对你想录制Activity里TextView动画的需求,我整理了几种Android平台上的方案,从一键操作到代码自定义都有,你可以按需选:
方案1:用系统自带录屏(最快上手,零代码)
这绝对是最省事儿的办法,完全不用改代码:
- 打开你的应用,进到目标Activity,准备好触发动画的条件
- 下拉通知栏,找到「屏幕录制」(不同品牌可能叫「录屏」,找不到的话去系统设置里搜就行)
- 点击开始录制,触发动画,等动画跑完再停止录制,视频会自动存到相册或者文件管理器里
- 优点:操作简单,不用碰代码;缺点:会录整个屏幕,要是只想保留动画区域,后期得剪一下
方案2:用MediaProjection API自定义录屏(精准控制录制区域)
如果你想精准只录LinearLayout那块儿的动画,或者要在代码里自动触发录制,那Android原生的MediaProjection API就很合适,步骤如下:
- 先在Manifest里加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 不需要录声音可以删掉这条 --> <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
- 请求录屏权限并初始化录制逻辑(以Kotlin为例):
private val REQUEST_CODE_SCREEN_RECORD = 1001 // 触发录屏权限请求 fun startAnimationRecording() { val mediaProjectionManager = getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager val intent = mediaProjectionManager.createScreenCaptureIntent() startActivityForResult(intent, REQUEST_CODE_SCREEN_RECORD) } // 处理权限请求结果 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_SCREEN_RECORD && resultCode == RESULT_OK) { // 获取你要录制的LinearLayout区域 val targetLayout = findViewById<LinearLayout>(R.id.target_linear_layout) val layoutRect = Rect() targetLayout.getGlobalVisibleRect(layoutRect) // 初始化MediaRecorder,配置录制参数 val mediaRecorder = MediaRecorder().apply { setVideoSource(MediaRecorder.VideoSource.SURFACE) setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) setVideoEncoder(MediaRecorder.VideoEncoder.H264) setVideoSize(layoutRect.width(), layoutRect.height()) setVideoFrameRate(30) // 保证动画流畅度 setOutputFile(getRecordingFilePath()) // 设置视频保存路径 } // 用MediaProjection创建虚拟显示,把布局内容渲染到录制Surface val mediaProjection = (getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager) .getMediaProjection(resultCode, data!!) val virtualDisplay = mediaProjection.createVirtualDisplay( "AnimationRecord", layoutRect.width(), layoutRect.height(), resources.displayMetrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mediaRecorder.surface, null, null ) // 开始录制 mediaRecorder.prepare() mediaRecorder.start() // 记得在动画结束后停止录制,比如在TextView的动画回调里: // mediaRecorder.stop() // mediaRecorder.release() // virtualDisplay.release() // mediaProjection.stop() } } // 生成视频保存路径 private fun getRecordingFilePath(): String { val moviesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) val videoFile = File(moviesDir, "text_animation_${System.currentTimeMillis()}.mp4") return videoFile.absolutePath }
- 温馨提示:Android 10及以上版本建议用MediaStore来保存文件,避免存储权限问题;另外要注意处理好组件的生命周期,别造成内存泄漏哦
方案3:用第三方库简化开发
要是觉得原生API太繁琐,也可以用第三方录屏库,比如ScreenRecorder这类,它们封装了MediaProjection的复杂逻辑,几行代码就能实现区域录制,不过选的时候要注意库的维护状态和兼容性哦
附上你提供的布局代码片段(补全了部分省略内容并添加了ID方便后续操作):
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/target_linear_layout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.8" android:gravity="center"> <TextView android:id="@+id/animated_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="带动画的文本"/> </LinearLayout> <!-- 其他布局内容 --> </LinearLayout>
内容的提问来源于stack exchange,提问作者Parth Patel
相关产品推荐
相关产品推荐

