- 博客(28)
- 资源 (10)
- 收藏
- 关注
原创 Flutter App性能优化关注点
参考:官方文档控制build()消耗避免在build方法中进行重复和高消耗的工作,因为build方法可能会被频繁的调用(当父组件、祖先组件rebuild时,当前组件的build也会被调用)。尝试将大组件拆分为多个小组件。当一个组件的setState被调用时,它的所有子孙组件也会rebuild。因此如果只是某一个子组件发生了变化,那就尽量只调用该子组件的setState,而不要去调用其父组件或祖先组件的setState。缓存没有变化的子树(If a subtree does not change.
2020-06-02 17:20:21 932
原创 FFmpeg解码视频流
项目代码: https://blog.csdn.net/al4fun/article/details/104293868下面代码展示了如何将H264视频流解码为YUV原始图像文件。关于从文件中获取数据包,这里采取的做法是通过fread直接读文件,并使用av_parser_parse2来得到packet。而另一种选择是通过AVFormatContext来加载文件,并通过av_read_fr...
2020-02-14 16:43:34 830
原创 FFmpeg转换文件封装格式
项目代码: https://blog.csdn.net/al4fun/article/details/104293868下面代码展示了如何将mp4文件转换为flv文件。因为mp4和flv都只是封装格式,底层音视频编码可以保持不变,因此这里的做法是直接从源文件中读取音视频流并写入目标文件,封装格式的转换由AVFormatContext完成。整体流程与提取音视频流类似,同样要进行时间基的转换...
2020-02-14 16:42:39 558
原创 FFmpeg提取音视频流
项目代码: https://blog.csdn.net/al4fun/article/details/104293868下面代码展示了如何从mp4文件中提取aac音频流。而提取视频流的操作方法与提取音频流基本一致,详情可以参考项目代码。其中一个主要的知识点是时间基的转换(时间基的相关概念可以参考这篇博文https://blog.csdn.net/bixinwei22/article/det...
2020-02-14 16:41:25 1684
原创 Demo:在 Android 中使用 FFmpeg 进行音视频编解码及处理
本项目展示如何在Android App中通过JNI调用FFmpeg动态库,以及使用FFmpeg进行基本音视频处理和编解码的方法。主要包含:音视频提取音视频编码、解码格式转换视频缩放音频重采样等如下图所示:代码:https://github.com/al4fun/HelloFFmpeg...
2020-02-13 12:38:43 2549
原创 Flutter实现3D球
简介这是之前项目中用到的一个3D球控件,实现了文字元素在球面上的分布以及球体滚动时文字外形和运动轨迹的透视效果。因为没有实现丰富的可定制性和通用性,因此这里仅提供源码,并对一些实现要点做简要介绍。若需实现类似效果可以参考。 主要思路建立了一个虚拟的3d坐标系:坐标原点位于球心,Z轴垂直于屏幕并指向屏幕外。根据球面方程将需要绘制的点均匀散布到整个球面上。由点坐标可以得到点在XY平面上的...
2020-02-12 17:39:41 3388 2
原创 水平滚动的数字选择标尺(Flutter)
功能水平滚动的数字选择标尺。支持:选取整数、小数。不同的步进。自定义刻度样式。自定义数字显示的格式、单位。惯性滚动。手指离开后自动对齐。为了使用的灵活性,控件被拆分为两部分,分别是:HorizontalNumberPicker:标尺。HorizontalNumberPickerWrapper:对HorizontalNumberPicker进行简单包装,添加顶部的选中值显示和两...
2020-02-11 20:27:02 3041
原创 didUpdateWidget详解
概述只要在父widget中调用setState,子widget的didUpdateWidget就一定会被调用,不管父widget传递给子widget构造方法的参数有没有改变。只要didUpdateWidget被调用,接来下build方法就一定会被调用。子widget首次被加载时的生命周期:initState -> build子widget首次被加载后,如果在父widget中调用...
2020-02-04 17:49:48 13533 1
原创 Flutter常用的布局组件
Flutter中有很多布局组件,看起来纷繁复杂,而实际上其中有很多布局组件都是“过时”的,也就是说它们都有更好更简单的替代品。下面就将我最近半年多Flutter开发中常用的布局组件做一个小归纳。1.常用布局组件Rowhttps://api.flutter.dev/flutter/widgets/Row-class.html构造函数:Row({ Key key, MainAxis...
2020-02-04 15:57:40 604
原创 Flutter中的路由函数
概述Flutter中,路由(Router)即页面的封装,一个路由内部包含了一个页面。创建路由:MaterialPageRoute route = MaterialPageRoute( builder: (BuildContext context) => MyPage(),);类似于在Android原生中以任务栈来管理Activity,在Flutter中以路由栈来管理路由。跳转到...
2019-09-21 21:40:07 1322
原创 Flutter中的Key和GlobalKey
1.Key参考:https://api.flutter.dev/flutter/widgets/Widget/key.html控制一个widget该如何替换掉树中的另一个widget:如果两个widget的runtimeType 和 key都相等(==),那么会让旧widget所对应的旧element转而指向新widget(即调用element.update);否则,旧element会被从...
2019-07-14 08:45:01 14992 1
原创 倒计时控件CountdownView
这是新项目中用到的一个倒计时控件,可以通过addView(…)添加到任意布局中。计时长短可调;各种颜色、尺寸可调;可以传入一个监听器,当计时结束时会得到通知。效果:基本用法:FrameLayout fl_container = findViewById(R.id.fl_container);//第2个参数为倒计时时长CountdownView countdownView = ...
2018-07-12 21:40:11 657
原创 工具类:并发任务管理器ConcurrentTasksManager
在app开发中经常会有这样一种需求:在多个线程中并发执行多个任务,当且仅当这些任务全部完成时,才继续进行下一步操作。以app的欢迎页为例,通常需要同时做这样几件事:1 获取基础的配置信息 2 检查更新 3 计时n秒(这是为了保证欢迎页至少被展示n秒),当且仅当这3个任务均被完成时,才跳转到app的主界面。通常的做法是写几个状态变量与并发执行的任务一一对应,每当一个任务完成时,就去更新并检查这些...
2018-04-08 16:37:06 630
原创 过滤器控件——FilterView
这是新项目中用到的一个过滤器控件,会根据输入数据动态生成过滤器视图。每组过滤条件为单选,当选择的过滤条件有变化时会通过回调方法通知用户,并更新标题栏上的条件显示。效果样式设置控件仅提供了几个简单的样式设置项,如文字颜色、背景颜色、按钮背景选择器等,通过相应的set方法来进行设置(如果有更复杂的需求建议直接修改控件源码):setAnimateDuration(long a...
2018-04-03 18:47:29 1442
原创 ViewPager导航控件——SimpleViewpagerIndicator
写这个小控件是因为最近负责维护的一款app大改版,设计师给了一个新的ViewPager导航样式,但找了几个常用的导航控件发现都无法100%实现设计师给的效果,于是就干脆自己动手丰衣足食了。控件只有一个单独的java类,代码也很简单,放出来希望能帮到需要的人。效果控件提供了比较丰富的可配置选项,下面是两个例子:1.所有配置项均使用默认值(tab宽度包裹内容、indicator与文...
2018-03-31 11:24:13 2526 1
原创 基于zbar的相机扫码性能优化实践
1 需求背景公司的多款工具类app都用到了相机扫码功能。近来,因为业务的快速发展,对扫码模块的性能也有了更高要求,主要是两方面:由于使用中经常会遇到商品条码密集排列的情况,因此要求扫码识别区域要非常精确。举个例子,比如扫码界面中展示给用户的扫码框是一个200*100的矩形,那么真正被识别的图像数据就只能是这个矩形框中的内容。针对多个条码连续扫描识别的情形,要求每个条码的识别时间尽可能地短,这样使
2017-11-22 16:02:56 5592 3
翻译 Android Camera详解
本文译自官方文档:https://developer.android.com/guide/topics/media/camera.htmlAndroid框架层包含了对多种相机和相机特性的支持,可以让你在你的应用中拍照或录像。本文档主要讨论如何快速、简单的进行拍照和录像,同时也对如何开发复杂一些的相机应用做了简要介绍。1 基础Android框架层支持通过android.hardware.camera2
2017-11-13 10:21:04 4916
原创 子窗口(child window)应用实战
1 在页面任意位置展示一个漂浮view1.1 需求背景前几天接到一个小需求,要在app某页面中显示一个漂浮的文字提示。本来想就弹个Toast的,但PM还要求文字提示支持手动关闭(比如触摸屏幕任意位置关闭,或者点击文字提示后关闭),那么系统的Toast就不能用了。另一方面,因为需要弹出文字提示的页面无论页面展示逻辑还是业务逻辑都异常复杂,所以不太希望去它的布局文件中添加view,也不希望对其代码逻辑有
2017-09-30 17:44:57 5144
原创 android事件传递——2.传递流程详解
1 完整的事件传递流程下沉事件从上到下(即从父级到子级),依次通过各个控件的dispatchTouchEvent方法:在dispatchTouchEvent方法中会调用onInterceptTouchEvent方法判断是否要拦截,如果拦截(onInterceptTouchEvent返回true),则将事件交给同一控件的onTouchEvent方法,如果不拦截,则将事件继续传递给子控件的dispat
2017-07-12 17:45:42 468
原创 android事件传递——1.概述
1 事件传递流程概述事件的传递是由最顶层(即最外层)的父控件开始,一层一层向下传递,直到最底层(即最内层)的子控件。若最底层的子控件没有消耗掉事件,则:事件又会从最底层的子控件开始,一层一层向上传递,直到最顶层的父控件。当父控件不拦截事件(onInterceptTouchEvent返回true,代表拦截事件)时,事件才会向下传递给其子控件。含有子view的viewGroup默认都不会拦截。当子控件不
2017-07-12 17:43:19 353
原创 Fragment使用过程中一些需要注意的点
对Fragment相关知识的一点复习和整理。1 使用add-hide-show来显示和切换fragmentadd(int containerViewId, Fragment fragment):将fragment添加到容器中,并不会remove掉容器中已有的fragment。fragment默认是可见的,下面两个方法可以改变fragment的可见状态:hide(Fragm...
2017-06-27 20:09:50 575
原创 NestedScrolling机制(四)——最后一个例子
系列文章的最后,让我们来实现最初见到的那个饿了么店铺详情页效果吧。成品效果及对比如下: 算是低仿吧,主要是也没想要仿的一模一样(因为懒)。内容部分有两个列表和只有一个列表其实是一样的道理(NestedScrollingParent 1vs2 无压力);至于两个列表之间的连动,只要监听列表内容的位置然后自己处理一下就好。闲话不多说,下面进入正题。1 activity_main.xml根布局就是我们后面
2016-12-26 20:54:37 2277 2
原创 NestedScrolling机制(三)——机制本质以及源码解析
要了解NestedScrolling机制的本质,当然少不了阅读源码。这里我们先给出结论:NestedScrolling机制本质上就是两个相互关联的接口,当我们调用一个接口中的方法时,另一个接口中与之对应的方法就会被触发,仅此而已。这就意味着,尽管我们之前介绍NestedScrolling机制时,为其加了很多条条框框和使用规则,但实际上,我们可以按照自己的需求和想法,完全自由的去使用它们————只要知
2016-12-26 20:47:43 1948 1
原创 NestedScrolling机制(二)——实例
1 实现自己的NestedScrollingParent和NestedScrollingChild这个示例来自:http://blog.csdn.net/lmj121212/article/details/52974427 自己在原项目代码基础上做了精简和梳理,添加了注释以帮助理解,下载地址:项目代码(已整理)此项目中的NestedScrollingParent和NestedScrollingCh
2016-12-26 20:43:25 3800 15
原创 NestedScrolling机制(一)——概述
如今,NestedScrolling机制(可以称为嵌套滚动或嵌套滑动)在各种app中的应用已经十分广泛了,下图是“饿了么”中的一个例子:当向上滚动列表时,列表的父view(整个白色部分)会跟着一起向上滑动,当顶部的banner收缩到只剩标题栏时,则列表的父view保持固定,而列表继续滚动;当向下滚动列表时,则是相反的过程。这种效果其实也可以通过CoordinatorLayout结合Behavior来
2016-12-26 20:28:44 4203 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人