SeniorUI_高级UI汇总目录
Android Design Support Library
- Navigation View——抽屉导航
- TextInputLayout——EditText悬浮标签
- Floating Action Button——悬浮操作按钮
- Snackbar——提示(类似Toast)
- TabLayout——选项卡
- CoordinatorLayout——滚动控制
- CollapsingToolbarLayout——可折叠的Toolbar(Google+、photos中的效果)
- AppBarLayout——容器AppBar
1 Meterail Design是什么?
视觉设计语音。,统一一种接近真实实物的视觉效果
https://material.io/
常见的一个app, 以其设置(Settings)作为说明:
- 位置: 除了 help & feedback 以为最下面的地方
- 作用:
必须是精选的一些能够让用户快速明白意思的,有提供选项给用户的,而且是根据优先级排列的items。 - 如何选择恰当的设置项
- 做出正确的default值
2 控件的兼容性
v4 v7 v13 数字代表的是支持的api 的version
theme 方式为什么能自适应 5.0 一下的版本呢?
AppCompatButton
android.support.v4.app.Button
一样的,一模一样
CircleImageView
EdgeEffectCompat: 将layout滑倒底后边界的波浪线
3 AppCompatActivity
作用:兼容。
AppCompatActivity extends FragmentActivity extends Activity
原理: 继承了AppCompatActivity 的Activity 都会在解析XML 的时候,将xml里面所有的系统控件转换为
appCompatButton。
它的源码是怎样的呢?
所谓的兼容,就是一个着色问题!!!
AppCompatDelegate 的工作就是涂色。
替换:widget着色是通过这个widget 的layout 在inflation 的时候,被AppCompatDelegate 拦截下来,然后根据
控件的名字,强制被系统转换成为 以AppCompat 开头的控件。
- AppCompatActivity:
加载View:
@Override
public void setContentView(@LayoutRes int layoutResID) {
getDelegate().setContentView(layoutResID);
}
getDelegate方法:
public AppCompatDelegate getDelegate() {
if (mDelegate == null) {
mDelegate = AppCompatDelegate.create(this, this);
}
return mDelegate;
}
- AppCompatDelegate的实现
AppCompatDelegateImplV9
AppCompatDelegateImplV9.setContentView->
@Override
public void setContentView(int resId) {
ensureSubDecor();
....
LayoutInflater.from(mContext).inflate(resId, contentParent);
...
}
->FactoryMerger.onCreateView
->AppCompatDelegateImplV9.onCreateView
-> AppCompatViewInflater.createView
switch (name) {
case "TextView":
view = new AppCompatTextView(context, attrs);
break;
case "ImageView":
view = new AppCompatImageView(context, attrs);
break;
case "Button":
view = new AppCompatButton(context, attrs);
break;
case "EditText":
view = new AppCompatEditText(context, attrs);
break;
case "Spinner":
view = new AppCompatSpinner(context, attrs);
break;
case "ImageButton":
view = new AppCompatImageButton(context, attrs);
break;
case "CheckBox":
结论:AppCompatActivity在加载xml布局时,TextView等控件被替换成了对应的AppCompatTextView从而实现了不同的渲染效果,类似的思想可以用于热换肤
4 分析 ViewGroup 的原则
- 这个类是干什么的,是控件还是组件,看他的初始化在干什么
- 找到入口,一般是构造器
- 找关键方法:onMeasure onLayout onDraw
LinearLayoutCompat的源码:
onMeasure 是 计算子控件的大小,同时计算自己的大小。自己的宽高是由子空间的宽高决定的,根据摆放的方向不同而算法不同
onLayout 是将子控件的上下左右位置进行确定。然后布局到layout上面
onDraw 只用来画layout 自己的分割线。