精华内容
下载资源
问答
  • 高清彩版 Android 进阶之光
  • 在本章笔者会介绍Android 5.0、Android 6.0以及Android 7.0的新特性,并会详细介绍Android 5.0和Android 6.0的新特性。虽然Android 7.0已经发布了,但是目前Android 5.0和Android 6.0的技术仍旧没有普及。笔者希望...
  • 通过本书的学习,想必你对 Android 开发有了更加深入的理解,并且会成为一名优秀的 Android 开发者。由于篇幅有限,我还有很多想要讲的技术知识无法在本书中展现,这些技术知识我会继续在自己的博客和微信公众号上...
  • 第11章 系统架构与MediaPlayer框架 本章将介绍Android系统架构和MediaPlayer框架。本书主要是讲解Android应用层知识的,在最后一章为何要讲解 Android 系统底层源码呢?其主要目的就是要告诉读者,作为一个Android...
  • 7.1 解析EventBus EventBus是一款针对Android优化的发布-订阅事件总线。它简化了应用程序内各组件间、组件与后台线程间的通信。其优点是开销小,代码更优雅,以及将发送者和接收者解耦。如果Activity和Activity进行...
  • 第9章 注解与依赖注入框架 在许多程序设计语言里,比如 Java、C#,依赖注入是一种较流行的设计模式,在 Android开发中也有很多实用的依赖注入框架,可以帮助我们少写一些样板代码,达到各个类之间解耦的目的。...
  • 目前Android的框架模式主要有MVC、MVP和MVVM,虽说最近比较流行MVP和MVVM,但是MVC也没有过时说,我们主要还是要根据业务来选择合适的架构。本章我们就来学习这3种框架模式及其应用的架构设计。 10.1 MVC模式 MVC...
  • 8.1.2 RxJava基本实现 在使用RxJava前请先在Android Studio 中配置gradle: 其中RxAndroid是RxJava在Android平台的扩展。它包含了一些能够简化Android开发的工具,比如特殊的调度器(后文会提到)。 RxJava的基本...
  • 设计模式的重要性不用我多说,如果你想成为优秀的 Android 工程师,设计模式是必须要掌握的。在本书加入设计模式这一章,其实并不突兀,因为本书的很多章节包括源码分析以及后文讲解的架构设计都是离不开设计模式的...
  • 相比下,网络层的功能是建立主机到主机的通信。传输层有两个传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。其中,TCP是一个可靠的面向连接的协议,UDP是不可靠的或者说无连接的协议。 5.应用层 应用程序...
  • 第4章 多线程编程 Android沿用了Java的线程模型,一个Android应用在创建的时候会开启一个线程,我们叫它主线程或者UI线程。如果我们想要访问网络或者数据库等耗时的操作时,都会开启子线程去处理,从Android 3.0开始...
  • 当我们将焦点移动到输入password的输入框时惊喜出现了:username的输入框上浮的文字回到原本的EditText中并伴有动画,而password的输入框中的hint值却上浮到了EditText上并伴有动画。焦点移动到password输入框时的...
  • 第3章 View体系与自定义View 本章将介绍Android中十分重要的View。这里我用了View体系来概括它,可见它的庞大。对于一个App来说,与用户的交互、将内容展示给用户,既是十分重要的,也是十分必要的,而这些就是一个...
  • 2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了《Android进阶之光》这本书的编写。...

    独立博客版本请点击这里
    勘误帖请点击这里
    源码地址https://github.com/henrymorgen/android-advanced-light
    进阶三部曲第二部http://liuwangshu.cn/life/android-advanced-decode.html

    由来

    2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了《Android进阶之光》这本书的编写。写作过程中并没有遇到什么困难,就是书名一直确定不下来,后来受到了《运营之光》的启发,这本书的名字才最终确定下来,寓意就是为Android开发者的进阶之路带来指引和光明。

    为什么写这本书

    官方话这里我就不说了,其实就两点:
    1.目前市场上的Android进阶书比较少,这本书的出现会帮助很多人。
    2.对自己是一个挑战,也会带来不少提高,最主要的是养成了持续学习的习惯。

    本书的内容

    本书共分为11章,内容页数却有478页,而且和《Android群英传》一样是大开本,可见本书对知识点并不是泛泛而谈,而是深入的讲解。
    第1章介绍Android5.0、6.0、7.0的新特性。包括5.0的RecyclerView、6.0的运行时权限机制和7.0的多窗口模式等知识点。
    第2章介绍Material Design以及Design Support Library常用的控件,并给出实例将Design Support Library中常用控件结合在一起使用。
    第3章介绍View相关的进阶知识,包括View的滑动、View的事件分发和View的工作流程。最后结合以上知识点来介绍自定义View。
    第4章介绍多线程编程,不仅包括基础的线程知识,还会介绍线程同步和线程池等进阶知识点,最后结合这些知识点来分析Android7.0的AsyncTask的源码。
    第5章介绍网络编程的基础知识以及常用的网络框架:Volley、OKHttp和Retrofit的使用方法和原理分析。
    第6章将设计模式进行分类,并介绍每个分类中常用的设计模式。
    第7章介绍事件总线EventBus和otto的使用方法和原理。
    第8章介绍函数响应式编程RxJava的使用方法,包括RxJava的基本使用、操作符、使用场景和源码分析等知识点。
    第9章会介绍注解的知识点和依赖注入框架ButterKnife和Dagger2的使用方法以及原理。
    第10章介绍了Android应用架构设计,包括MVP框架以及MVP结合RxJava和Dagger2,MVVM框架相关的Data Binding支持库。
    第11章主要是指引读者进行Android系统源码阅读并带其入门,介绍Android系统框架、源码目录和阅读源码工具。并以分析MediaPlayer框架的源码作为示例。

    本书的特色

    1.本书整体的结构是由浅入深,从最简单的第1章到难一些的第11章,难度是逐步加深的。
    2.本书为了分析一些框架的原理,会介绍一些知识点做铺垫,比如为了更好的介绍依赖注入框架那么需要首先了解注解相关的知识点。再比如要分析AsyncTask的源码则需要了解线程池和阻塞队列等知识点。
    3.本书的知识点环环相扣,比如要介绍MVP框架的设计,就需要先学习Retrofit、RxJava和Dagger2的相关知识点。
    4.本书对于很多知识点都有很深入的讲解,对于常用的框架比如OKHttp、Retrofit、EventBus和RxJava等等不只是讲解了如何使用,而是更加深入的介绍其原理。
    5.本书是目前市场上少有的详细介绍网络框架、事件总线、RxJava、依赖注入框架以及应用架构设计的书籍。

    面向的读者

    本书章节设计是由浅入深的,定位是学习Android第二本书,阅读的前提是要有一定的Android基础。适合于Android初、中、高级的工程师阅读。对于初、中级工程师会帮助他们向高级工程师迈进,而高级工程师也会从本书系统的知识体系中获益良多。

    目录

    1.jpg
    2.jpg
    3.jpg
    4.jpg
    5.jpg
    6.jpg

    封面

    封面是美女设计师设计的,是一个武侠风格的机器人(书中很多例子都涉及到了武侠)。
    1059158635_副本.jpg

    感谢为这本书写推荐语的朋友们,感谢你们的支持。
    IMG_2851_副本.jpg

    购买

    京东
    天猫
    当当
    亚马逊

    勘误和互动

    本人虽然已经竭尽全力,但始终难免会有错误,欢迎大家向我反馈。
    勘误地址:http://liuwangshu.cn/life/android-advanced-light-corrigendum.html

    本书的互动地址:
    独立博客:http://liuwangshu.cn
    github:https://github.com/henrymorgen
    qq群:499174415
    公众号:刘望舒

    源码下载地址为:https://github.com/henrymorgen/android-advanced-light

    后记

    由于本书的篇幅有限,我还有很多想要讲的技术知识无法在书中写出,这些技术知识会继续在我的博客和微信公众号上分享出来。如果感兴趣,你可以在我的博客和微信公众号中继续学习。


    这里不仅分享大前端、Android、Java等技术,还有程序员成长类文章。
    ZmD7sH.jpg
    展开全文
  • 深入理解jvm虚拟机+Android进阶之光-附件资源
  • 第一部成名作《Android进阶之光》最近出了第二版,专门为应用开发进阶和面试打造!作为小福利,今日抽取 5 本送给大家。《Android进阶之光》第2版更新内容1.开头加入Android...

    第一部成名作《Android进阶之光》最近出了第二版,专门为应用开发进阶和面试打造!

    作为小福利,今日抽取 5 本送给大家。

    《Android进阶之光》第2版更新内容

    1.开头加入Android进阶三部曲知识体系
    2.新特性更新到Android 10
    3.升级了部分第三方框架版本,比如OkHttp 4和RxJava 3
    4.修订第1版的细节多达400余处。
    5.全书大小变为和《Android进阶解密》一样大,页数由479页变为529页。

    本书作者刘望舒一直想在书中建立一个知识体系,但是凭借一本书是形成不了成规模的知识体系的,而他出版了Android进阶三部曲终于打破了这一点。

     

    这三本书初步形成了知识体系,即Android进阶三部曲知识体系。他在《Android进阶之光》第2版加入了序章,就叫:Android进阶三部曲知识体系,可以说是这三本书全部知识点的索引。《Android进阶之光》第2版并不是“单兵作战”,而是“集体作战”。它也是目前市场上详细介绍有关Android新特性、Material Design、网络框架、事件总线、RxJava、依赖注入框架和应用架构设计的难得一见的图书。 

    购买通道

    •  https://item.jd.com/13127482.html

    • http://product.dangdang.com/1838450176.html

    赠书福利

    1、关注公众号

    2、回复新书

    3、等待开奖

    展开全文
  • Android进阶三部曲第一部《 Android进阶之光》原始码 原始目录介绍 目录 简介 第1章 第1章Android新特性 第2章 第2章材料设计 第3章 第3章视图体系与自定义视图 无源码 第4章多线程编程 第5章 第5章网络编程与网络...
  • 文章目录第1章 Android新特性 1第2章 Material Design 48第3章 View体系与自定义View 87第4章 多线程编程 165第5章 网络编程与...《Android进阶之光》是一本Android进阶类书籍,书中各知识点由浅入深、环环相扣,最终这


    出版年: 2017-7

    简介:
    《Android进阶之光》是一本Android进阶类书籍,书中各知识点由浅入深、环环相扣,最终这些知识点形成了一个体系结构。《Android进阶之光》共分为11章。第1章介绍Android 5.0到Android 7.0的新特性。第2章介绍Material Design。第3章介绍View体系,包括View的事件分发、工作流程、自定义View等知识点。第4章介绍多线程的知识。第5章介绍网络编程与网络框架的知识。第6章介绍常用的设计模式。第7章介绍事件总线。第8到第10章介绍架构设计所需要的知识点。第11章简单介绍Android系统框架与MediaPlayer框架。

    《Android进阶之光》详细并深入讲解Android开发者必备的和前沿的知识,适合有一定开发基础的开发者阅读,这有助于他们提高技术水平;同时,《Android进阶之光》系统的知识体系结构也令高级开发者从中获益良多。

    豆瓣

    第1章 Android新特性 1

    1.1 Android 5.0新特性 1
    1.1.1 Android 5.0主要新特性概述 1
    1.1.2 替换ListView和GridView的RecyclerView 3
    1.1.3 卡片CardView 13
    1.1.4 3种Notification 18
    1.1.5 Toolbar与Palette 23
    1.2 Android 6.0新特性 29
    1.2.1 Android 6.0主要新特性概述 29
    1.2.2 运行时权限机制 30
    1.3 Android 7.0新特性 43
    1.3.1 Android 7.0主要新特性概述 43
    1.3.2 多窗口模式 44
    1.4 本章小结 47

    第2章 Material Design 48

    2.1 Material Design概述 48
    2.1.1 核心思想 48
    2.1.2 材质与空间 49
    2.1.3 动画 49
    2.1.4 样式 50
    2.1.5 图标 51
    2.1.6 图像 51
    2.1.7 组件 51
    2.2 Design Support Library常用控件详解 54
    2.2.1 Snackbar的使用 54
    2.2.2 用TextInputLayout实现登录界面 55
    2.2.3 FloatingActionButton的使用 60
    2.2.4 用TabLayout实现类似网易选项卡的动态滑动效果 61
    2.2.5 用NavigationView实现抽屉菜单界面 68
    2.2.6 用CoordinatorLayout实现Toolbar隐藏和折叠 74
    2.3 本章小结 86

    第3章 View体系与自定义View 87

    3.1 View与ViewGroup 87
    3.2 坐标系 89
    3.2.1 Android坐标系 89
    3.2.2 View坐标系 90
    3.3 View的滑动 91
    3.3.1 layout()方法 92
    3.3.2 offsetLeftAndRight()与offsetTopAndBottom() 94
    3.3.3 LayoutParams(改变布局参数) 95
    3.3.4 动画 95
    3.3.5 scrollTo与scollBy 96
    3.3.6 Scroller 98
    3.4 属性动画 99
    3.5 解析Scroller 105
    3.6 View的事件分发机制 108
    3.6.1 源码解析Activity的构成 108
    3.6.2 源码解析View的事件分发机制 112
    3.7 View的工作流程 119
    3.7.1 View的工作流程入口 119
    3.7.2 理解MeasureSpec 122
    3.7.3 View的measure流程 126
    3.7.4 View的layout流程 132
    3.7.5 View的draw流程 135
    3.8 自定义View 139
    3.8.1 继承系统控件的自定义View 140
    3.8.2 继承View的自定义View 141
    3.8.3 自定义组合控件 147
    3.8.4 自定义ViewGroup 152
    3.9 本章小结 164

    第4章 多线程编程 165

    4.1 线程基础 165
    4.1.1 进程与线程 165
    4.1.2 线程的状态 167
    4.1.3 创建线程 168
    4.1.4 理解中断 170
    4.1.5 安全地终止线程 171
    4.2 同步 173
    4.2.1 重入锁与条件对象 173
    4.2.2 同步方法 175
    4.2.3 同步代码块 176
    4.2.4 volatile 177
    4.3 阻塞队列 183
    4.3.1 阻塞队列简介 183
    4.3.2 Java中的阻塞队列 184
    4.3.3 阻塞队列的实现原理 186
    4.3.4 阻塞队列的使用场景 188
    4.4 线程池 190
    4.4.1 ThreadPoolExecutor 190
    4.4.2 线程池的处理流程和原理 192
    4.4.3 线程池的种类 193
    4.5 AsyncTask的原理 197
    4.6 本章小结 203

    第5章 网络编程与网络框架 204

    5.1 网络分层 204
    5.2 TCP的三次握手与四次挥手 205
    5.3 HTTP协议原理 207
    5.3.1 HTTP简介 207
    5.3.2 HTTP请求报文 208
    5.3.3 HTTP响应报文 209
    5.3.4 HTTP的消息报头 210
    5.3.5 抓包应用举例 211
    5.4 HttpClient与HttpURLConnection 212
    5.4.1 HttpClient 212
    5.4.2 HttpURLConnection 216
    5.5 解析Volley 218
    5.5.1 Volley基本用法 218
    5.5.2 源码解析Volley 223
    5.6 解析OkHttp 231
    5.6.1 OkHttp基本用法 232
    5.6.2 源码解析OkHttp 240
    5.7 解析Retrofit 255
    5.7.1 Retrofit基本用法 255
    5.7.2 源码解析Retrofit 261
    5.8 本章小结 270

    第6章 设计模式 271

    6.1 设计模式六大原则 271
    6.2 设计模式分类 273
    6.3 创建型设计模式 273
    6.3.1 单例模式 274
    6.3.2 简单工厂模式 277
    6.3.3 工厂方法模式 279
    6.3.4 建造者模式 281
    6.4 结构型设计模式 284
    6.4.1 代理模式 285
    6.4.2 装饰模式 288
    6.4.3 外观模式 291
    6.4.4 享元模式 295
    6.5 行为型设计模式 298
    6.5.1 策略模式 298
    6.5.2 模板方法模式 301
    6.5.3 观察者模式 304
    6.6 本章小结 307

    第7章 事件总线 308

    7.1 解析EventBus 308
    7.1.1 使用EventBus 308
    7.1.2 源码解析EventBus 314
    7.2 解析otto 324
    7.2.1 使用otto 324
    7.2.2 源码解析otto 327

    第8章 函数响应式编程 333

    8.1 RxJava基本用法 333
    8.1.1 RxJava概述 333
    8.1.2 RxJava基本实现 334
    8.1.3 RxJava的不完整定义回调 336
    8.2 RxJava的Subject 338
    8.3 RxJava操作符入门 339
    8.3.1 创建操作符 339
    8.3.2 变换操作符 340
    8.3.3 过滤操作符 344
    8.3.4 组合操作符 349
    8.3.5 辅助操作符 352
    8.3.6 错误处理操作符 355
    8.3.7 条件操作符和布尔操作符 357
    8.3.8 转换操作符 360
    8.4 RxJava的线程控制 362
    8.5 RxJava的使用场景 362
    8.5.1 RxJava结合OkHttp访问网络 362
    8.5.2 RxJava结合Retrofit访问网络 364
    8.5.3 用RxJava实现RxBus 368
    8.6 RxJava源码解析 370
    8.6.1 RxJava的订阅过程 371
    8.6.2 RxJava的变换过程 372
    8.6.3 RxJava的线程切换过程 376
    8.7 本章小结 381

    第9章 注解与依赖注入框架 382

    9.1 注解 382
    9.1.1 注解分类 382
    9.1.2 定义注解 384
    9.1.3 注解处理器 385
    9.2 依赖注入的原理 392
    9.2.1 控制反转与依赖注入 392
    9.2.2 依赖注入的实现方式 393
    9.3 依赖注入框架 395
    9.3.1 为何使用依赖注入框架 395
    9.3.2 解析ButterKnife 395
    9.3.3 解析Dagger2 405
    9.4 本章小结 421

    第10章 应用架构设计 422

    10.1 MVC模式 422
    10.2 MVP模式 423
    10.2.1 应用MVP模式 424
    10.2.2 MVP结合RxJava和Dagger2 431
    10.3 MVVM模式 438
    10.3.1 解析Data Binding 439
    10.3.2 应用Data Binding 457
    10.4 本章小结 459

    第11章 系统架构与MediaPlayer框架 460

    11.1 Android系统架构 460
    11.2 Android系统源码目录 463
    11.2.1 整体结构 463
    11.2.2 应用层部分 464
    11.2.3 应用框架层部分 465
    11.2.4 C/C++程序库部分 465
    11.3 Source Insights使用 466
    11.4 MediaPlayer框架 467
    11.4.1 Java Framework层的MediaPlayer分析 467
    11.4.2 JNI层的MediaPlayer分析 469
    11.4.3 Native层的MediaPlayer分析 471
    11.5 本章小结 478

    展开全文
  • Android进阶之光》Horizontal 读书笔记 public class HorizontalView extends ViewGroup { private int lastInterceptX; private int lastInterceptY; private int lastX; private int lastY; pr

    《Android进阶之光》Horizontal 读书笔记

    滑动不超过屏幕宽度一半时

    滑动超过屏幕宽度(这里 childWidth  = match_parent)一半时

    public class HorizontalView extends ViewGroup {
    
        private int lastInterceptX;
        private int lastInterceptY;
        private int lastX;
        private int lastY;
    
        private int childWidth;
    
        private int curIndex;
        private Scroller scroller;
    
        //测试滑动速度
        private VelocityTracker tracker;
    
        public HorizontalView(Context context) {
            this(context, null);
        }
    
        public HorizontalView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public HorizontalView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            scroller = new Scroller(getContext());
            tracker = VelocityTracker.obtain();
        }
    
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            measureChildren(widthMeasureSpec, heightMeasureSpec);
    
            int widthSpec = MeasureSpec.getMode(widthMeasureSpec);
            int heightSpec = MeasureSpec.getMode(heightMeasureSpec);
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    
            //若无子元素,宽高设置为0
            if (getChildCount() == 0) {
                setMeasuredDimension(0, 0);
            }
            View childOne = getChildAt(0);
            int childWidth = childOne.getMeasuredWidth();
            int childHeight = childOne.getMeasuredHeight();
    
            if (widthSpec == MeasureSpec.AT_MOST) {
                //若宽为 at_most , 定义宽为所有子元素的宽
                widthSize = childWidth * getChildCount();
            }
    
            if (heightSpec == MeasureSpec.AT_MOST) {
                //若高为 at_most 定义高为第一个子元素的高
                heightSize = childHeight;
            }
            setMeasuredDimension(widthSize, heightSize);
        }
    
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            int childCount = getChildCount();
            int left = 0;
            View child;
            for (int i = 0; i < childCount; i++) {
                child = getChildAt(i);
                if (child.getVisibility() != View.GONE) {
                    int width = child.getMeasuredWidth();
    
                    childWidth = width;
    
                    child.layout(left, 0, left + width, child.getMeasuredHeight());
                    left += width;
                }
            }
        }
    
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            boolean intercept = false;
            int x = (int) ev.getX();
            int y = (int) ev.getY();
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    //滑动时再次点击停止
                    intercept = false;
                    if (!scroller.isFinished()) {
                        scroller.abortAnimation();
                    }
                    break;
                case MotionEvent.ACTION_MOVE:
                    int deltaX = x - lastInterceptX;
                    int deltaY = y - lastInterceptY;
                    intercept = Math.abs(deltaX) - Math.abs(deltaY) > 0;
    
                    break;
                case MotionEvent.ACTION_UP:
                    break;
            }
    
            lastInterceptX = x;
            lastInterceptY = y;
    
            lastX = x;
            lastY = y;
            return intercept;
        }
    
    
        //若 viewGroup 拦截则执行
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    if (!scroller.isFinished()) {
                        scroller.abortAnimation();
                    }
                    break;
                case MotionEvent.ACTION_MOVE:
                    int deltaX = x - lastX;
                    scrollBy(-deltaX, 0);
                    break;
                case MotionEvent.ACTION_UP:
                    int dis = getScrollX() - curIndex * childWidth;
                    if (Math.abs(dis) > childWidth / 2) {
                        if (dis > 0) {
                            curIndex++;
                        } else {
                            curIndex--;
                        }
                    } else {
                        tracker.computeCurrentVelocity(1000);
                        float xV = tracker.getXVelocity();
                        if (xV > 50) {
                            if (xV > 0) {
                                curIndex--;
                            } else {
                                curIndex++;
                            }
                        }
                    }
                    //修正curIndex
                    curIndex = curIndex < 0 ? 0 :
                            curIndex > getChildCount() - 1 ? getChildCount() - 1 : curIndex;
                    //处理 Action_move 滑动结果,左滑或右滑
                    smoothScrollTo(curIndex * childWidth, 0);
    
                    //重置计算器
                    tracker.clear();
                    break;
            }
    
            lastX = x;
            lastY = y;
            return super.onTouchEvent(event);
        }
    
        @Override
        public void computeScroll() {
            super.computeScroll();
            if (scroller.computeScrollOffset()) {
                scrollTo(scroller.getCurrX(), scroller.getCurrY());
                postInvalidate();
            }
        }
    
        /**
         * 弹性滑动
         */
        public void smoothScrollTo(int destX, int destY) {
            scroller.startScroll(getScrollX(), getScrollY(),
                    destX - getScrollX(), destY - getScrollY(), 1000);
            invalidate();
        }
    }
    展开全文
  • Android进阶之光》续作内容简介

    千次阅读 2018-05-15 16:49:44
    Android进阶之光》续作的书名现在还没有定,目前已经完稿,预计会在9月出版。本书基于Android8.0,理念和《Android开发艺术探索》相近,是将源码和应用开发相结合并融会贯通。本书共分为17章从三个方面来组织内容...
  • 第二版 链接:https://pan.baidu.com/s/1ENeTvvKD8iUcMdPDIkBmXQ 提取码:rgw7 第三版 ...提取码:h0k1 Android进阶之光 链接:https://pan.baidu.com/s/101L7A3DYub4e68zrGT6YWQ 提取码:yre3 ...
  • 跟着《Android进阶之光》复习下RecyclerView。 重要的几点: 你想要控制其显示的方式,请通过布局管理器LayoutManager 你想要控制Item间的间隔(可绘制),请通过ItemDecoration 你想要控制Item增删的动画,请...
  • 接上篇《Android进阶之光》--Android新特性 No1: 组件: 1)底部工作条-Bottom Sheets 2)卡片-Cards 3)提示框-Dialogs 4)菜单-Menus 5)选择器 6)滑块控件-Sliders 7)进度和动态 8)Snackbar(底部...
  • 今日阅读:《android进阶之光》的事件总线部分,整理如下 事件总线知识点: 1.EventBus:就是事件,可以是任意对象 2.Subscriber:事件的订阅者 3.Publisher:事件的发布者 4.线程模型: POSTING:在这种模型下,...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 262
精华内容 104
关键字:

android进阶之光