SeniorUI21_Meterail Design

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)作为说明:

  1. 位置: 除了 help & feedback 以为最下面的地方
  2. 作用:
    必须是精选的一些能够让用户快速明白意思的,有提供选项给用户的,而且是根据优先级排列的items。
  3. 如何选择恰当的设置项
  4. 做出正确的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 开头的控件。

  1. 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;
    }
  1. 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 的原则

  1. 这个类是干什么的,是控件还是组件,看他的初始化在干什么
  2. 找到入口,一般是构造器
  3. 找关键方法:onMeasure onLayout onDraw

LinearLayoutCompat的源码:
onMeasure 是 计算子控件的大小,同时计算自己的大小。自己的宽高是由子空间的宽高决定的,根据摆放的方向不同而算法不同
onLayout 是将子控件的上下左右位置进行确定。然后布局到layout上面
onDraw 只用来画layout 自己的分割线。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值