Android 开发艺术探索笔记-4.View的工作原理 | cfanr

作者:JerryXia | 发表于 , 阅读 (41)
4.1初识ViewRoot和DecorViewViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程都是通过ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联,源码如下:12root = new ViewRootImpl(view.getContext(), display);root.setView(view, wparam, panelParentView);
View的绘制流程是从ViewRoot的performTraversals方法开始的,它经过measure、layout和draw三个过程才能最终将一个View绘制出来,其中measure用来测量View的宽和高,layout用来确定View在父容器中的放置位置,而draw则负责将View绘制在屏幕上,流程如图:

measure过程决定了view的宽高,通...阅读全文

Android编程规范 | cfanr

作者:JerryXia | 发表于 , 阅读 (38)
前言在软件开发中,没有规矩不成方圆,但规则是人制定的,没有标准,只有适合自己或团队的才是最好的,当然前提是整体上要符合编程语言的规范。
一、命名规范1.包命名规则:包名全部小写,采用反域名命名规则,一级包名是顶级域名,通常为com, edu, gov, net, org等,二级包名,通常为公司名或部门名或者个人名,三级包名通常为项目名,四级包名为模块名或者层级名。以下是从层级包名来划分Android项目中采用的包划分结构:(在实际项目中可以采用包命名和模块命名结合的方式)
12345678910111213- com.domain.xxx.ui (用户界面相关)    - com.domain.xxx.ui.activity        //所有的Activity类    - com.domain.xxx.ui.fragment     //所有的Fragment类    - com.domain.xxx.ui.dialog       //所有对话框- com.domain.xxx.ui.adapter        //所有的Adapter类(适配器类)- com.domai...阅读全文

Android用建造者模式实现一个新功能引导页 | cfanr

作者:JerryXia | 发表于 , 阅读 (24)
最近每次版本更新都会在UI变动或加了新功能的地方加一个引导蒙层页面(新功能标记、文案和一个“知道了”的按钮),有时候一个版本会加三四个页面,原来的做法是:
1.在每个Activity的布局文件外层添加一个FrameLayout(这方法好蠢,又要嵌套一层布局);2.再将需要显示的引导页布局加在后面(或用include的方式);3.写两个方法,获取和设置是否显示了该引导页的判断,存储到SharedPreferences;4.最后在对应Activity页面添加对应控制引导页显隐的逻辑每添加一个页面就要重复上面四个步骤,而且之后版本迭代需要去掉这些冗余代码时也比较麻烦,改动的地方比较多,不利于管理。这方法太笨了,不能纯粹只为了完成功能呀,于是想了一个简单有效的方法。

首先解决避免改动原Activity布局的问题,只要通过findViewById(android.R.id.content)获取Activity根布局下的FrameLayout, 再将需要添加的引导页布局addView(view)进入就可以了123FrameLayout rootLayout = (FrameLayout) ...阅读全文

ANDROID视频引导滑动黑屏扫雷以及解决方案 | cfanr

作者:JerryXia | 发表于 , 阅读 (57)
前一段时间,公司项目需要做一个视频引导的功能,刚开始以为用个 ViewPager+Fragment+VideoView 不就实现了吗,很快就弄好了。不过后来测试发现在滑动切换页面时会出现黑屏,比较影响用户体验,然后在网上找了各种“可行”的方案,都未能完全解决,最后尝试了一种巧妙的方法才解决这个问题。
首先说明下,这里视频引导用到的技术点是 ViewPager+Fragment+VideoView(当然也使用过 SurfaceView 来实现,不过原理基本一致),产品提供四个单独的视频(不是一个视频)+ 引导的圆点和进入主页的按钮(不是直接添加在视频上的)。另外限制条件是,产品未提供每个视频的第一帧的图片。
解决滑动切换页面黑屏的问题出现黑屏的解释:videoview加载资源需要一定的耗时,无内容时会绘制黑色背景。
1.用遮罩方式掩盖黑屏用第一帧的图片作为 videoview 的遮罩,当视频加载好,再隐藏掉这个遮罩。以下例子并不能完全解决黑屏:
a.  Android VideoView black screen - Stack Overflow可以看到评论,滑动还是看会有闪烁,...阅读全文

 认知Activity启动模式 | 聪聪的豆芽 

作者:JerryXia | 发表于 , 阅读 (62)
1.1 Activity的LaunchModeactivity启动模式基本知识不在描述。本文主要是在使用过的前提下进行了进一步的认知。首先任务栈大家都知道,先进后出、后进先出。如果任务栈没有activity了,那就会被系统所回收。Activity启动模式有四种:standard、singleTop、singleTask、singleInstance。
1.1.1 standard标准模式、系统默认模式,每次启动均会创建实例压入栈中。这里有一个点:编写类似下面代码启动activity会报错:12MyApplication.getInstance().startActivity(   new Intent(MainActivity.this, AAy.class));
报错:123android.util.AndroidRuntimeException:  Calling startActivity() from outside of an Activity  context requires  the FLAG_ACTIVITY_NEW_TASK flag. Is this real...阅读全文