上篇文章,通过 MediaProjectionManager 结合 MediaRecorder 进行录屏并生成视频文件。新版本需求产品提了个:视频增加背景音乐,音频文件内置在 Apk 中。那么,怎么生成带音频的视频呢?
通过调研发现,在用 MediaPlayer 进行录屏时,可以添加音频源,但是基本是使用麦克风录音,无法指定音频文件。代码如下:
1 | /** |
上篇文章,通过 MediaProjectionManager 结合 MediaRecorder 进行录屏并生成视频文件。新版本需求产品提了个:视频增加背景音乐,音频文件内置在 Apk 中。那么,怎么生成带音频的视频呢?
通过调研发现,在用 MediaPlayer 进行录屏时,可以添加音频源,但是基本是使用麦克风录音,无法指定音频文件。代码如下:
1 | /** |
最近 Keep 更新了一个轨迹动画的分享,可以生成一个看起来高大上的视频。项目产品也提出了一样的需求,便参照着实现了一波。效果如下(虚拟机跑动画就已经很卡了,然后还要录 gif 就更卡了,凑合看~):
startActivityForResult 相信大家都用过,调用和返回结果是分散开的,使用起来最好还是封装一下比较好。这里利用一个空的 Fragment 进行封装,代码比较简单。
封装的回调类 StartForResultListener:
1 | public interface StartForResultListener { |
作为一名 Android 开发者,对于 shape 文件肯定不会陌生。但是,用时一时爽,到后面遇到缩包要求时,或者强迫症开发者不希望有重复的 shape 文件,便是有苦说不出了。
通常,我们定义 shape 文件可能会根据业务来,代表这个 shape 文件在哪里用到,举个栗子:vyg__route_search_bg_selector.xml
,开发人员看到这个 shape 文件可以知道是在路线搜索页面用到的。可是这样命名,当开发人员各自独立开发时,可能会有一大堆业务相关的 shape 文件,可能会和其他开发人员相关业务重复了。所以后面我们干脆改成这样了:vyg__shape_r2_f7f7f7.xml
,代表 2dp 的 radius,然后填充色是 #F7F7F7。如果项目设计师严格按照一套标准来设计所有的背景,这样命名一套 shape 文件可以做到复用了。可如果设计师经常换人,或者不够专业等等其他原因,这里一个颜色,那里又是另外一个颜色,或者把 2dp 的圆角变成 4dp,如此下来,shape 文件依然会很多。就像这样:
有这样一个需求:
作为一个 Android 开发者,首先想到的就是用 PopupWindow 来实现。底部阴影的高度固定,剩余的高度全部填充到 PopupWindow,然后调用 PopupWindow 的 showAsDropDown 让它在应用标题栏下面显示就行了。
近期整理代码,出现了一个空指针异常,其源头为 MapController 类的一个方法:
1 | public void addOnMarkerClickListener(AMap.OnMarkerClickListener onMarkerClickListener) { |
作为 Android 开发者,当提到“保活”时,心中的滋味可谓是五味杂陈。互联网上也有各种“黑科技”来达到相应的目的。若是普通的应用,我是十分拒绝进行保活的,当用户不需要你了,还要偷偷地活着,做一些事情。最近参与开发的一款 App 是跟地图相关的,有着「录轨迹」的功能,当用户开启录制功能后,即使退出应用到后台,也是期望能够继续录制的,所以便研究了一番保活,并实践了一下,最后效果也还不错。
说下总体方案:1 像素 Activity 、音频播放、前台服务。
现在 Android 开发中列表 Header 吸顶效果比较常见了,针对 ListView、RecyclerView 都有多种实现方式。之前开发也碰到过,都是用的三方库或者框架。今天主要写下直接利用 Android 原生来进行实现。
页面大致如下:
最近新做的项目,有点性能问题,今天集中弄了下性能优化,又发现了一个 kotlin 中的坑。其实也不算是坑,只是使用不熟练而已。
介绍下场景:项目有用到高德地图,高德地图的 MapView 需要在 Activity 或者 Fragment 的声明周期中进行调用,就像这样:
1 | @Override |
今天碰到个问题,起初看的时候一脸懵逼,后面追溯问题根源,发现是 kotlin 里的一个坑。看下代码:
1 | override fun showRoadCondition(list: List<MyObject>) { |
这样一个方法,需要将列表的数据,根据 8 个一组进行划分。subList 生成的一个 List 不是我们平常使用的 List,所以后面加上了 kotlin 自带的 toList() 方法,来转化成真正的 List。
这段代码在大多数情况下都没有什么问题,但是当 list 的长度为 9、17、25等等时就会崩溃。所报异常为:
1 | java.util.Collections$SingletonList cannot be cast to java.util.ArrayList |
tag:
缺失模块。
1、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
2、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: true raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true