前言侧滑手势在Android App应用得非常广泛,常见的使用场景包括:滑动抽屉、侧滑删除、侧滑返回、下拉刷新以及侧滑封面等。由于这些使用场景实在是太通用了,各路大神们八仙过海各显神通,每种侧滑场景都开源出了很多非常实用的框架,让我们的业务开发便利了很多。 目前,我们需要为每种场景引入不同的侧滑框架,由于App中的侧滑场景很多,我们项目中也就需要引入多个侧滑框架,而每个框架的使用方式各有不同,需要单独学习,团队的学习成本较高。 那么问题来了,有没有一种框架能解决所有侧滑需求呢? 一个框架解决所有侧滑需求?你确定不是在开玩笑?在刚开始学习面向对象编程概念的时候我们就知道一个道理:解决一个软件问题,首先要将它抽象出来。 针对侧滑这个手势,我们能不能将它的概念抽象一下,到底侧滑指的是什么呢? 狭义侧滑:从屏幕的某侧的边缘开始向着远离该边缘的方向滑动 广义侧滑:手指在屏幕上按下之后向着某一侧方向 ...
我们经常用的Loading动画居然还有这种姿势
Gloading效果演示为Activity添加加载状态 加载成功 加载失败点击重试 加载成功无数据 个别页面使用特殊的Loading视图 为View添加加载状态 单个View 多个View 用于GridView 用于RecyclerView并且不显示文字 背景Loading动画几乎每个Android App中都有。 一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验。 同样的道理,当加载的数据为空时显示一个数据为空的视图、在数据加载失败时显示加载失败对应的UI并支持点击重试会比白屏的用户体验更好一些。 加载中、加载失败、空数据的UI风格,一般来说在App内的所有页面中需要保持一致,也就是需要做到全局统一。 1. 传统的做法 定义一个(或多个)显示不同加载状态的控件 ...
Python读写properties文件
最近用python写个工具,涉及到properties文件的读写操作。发现Python并没有提供操作properties文件的库,只有一个 ConfigParser 类来支持 .ini 文件的读写,这显然不是我想要的,于是一番折腾后整出下面这个工具类: property.py#!/usr/bin/python# -*- coding: utf-8 -*-import reimport osimport tempfileclass Properties: def __init__(self, file_name): self.file_name = file_name self.properties = {} try: fopen = open(self.file_name, 'r') ...
AutoRegister:Android模块解耦利器
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 摘要在编译时,扫描即将打包到apk中的所有类,将所有组件类收集起来,通过修改字节码的方式生成注册代码到组件管理类中,从而实现编译时自动注册的功能,不用再关心项目中有哪些组件类了。特点:不需要注解,不会增加新的类;性能高,不需要反射,运行时直接调用组件的构造方法;能扫描到所有类,不会出现遗漏;支持分级按需加载功能的实现。 前言最近在公司做android组件化开发框架的搭建,采用组件总线的方式进行通信:提供一个基础库,各组件(IComponent接口的实现类)都注册到组件管理类(组件总线:ComponentManager)中,组件之间在同一个app内时,通过ComponentManager转发调用请求来实现通信(不同app之间的通信方式不是本文的主题,暂且略去)。但在实现过程中遇到了一个问题: 如何将不同module中的组 ...
CC框架实践(1):实现登录成功再进入目标界面
CC框架基因中自带支持组件层面的AOP,在定义组件时,实现IComponent.onCall(cc)方法,并根据cc中的参数来执行组件中的具体逻辑(如:页面跳转等)。 可以在调用具体逻辑之前对该功能进行AOP实现,例如:登录、页面数据预加载等 用CC框架实现必须先登录再进入目标页面功能目标页面所在的组件在执行页面跳转前调用登录组件(用户中心组件)获取用户信息,若未登录则登录后返回用户信息。 这里有2个点: 1. 若用户已登录,则直接返回用户信息,同步方式实现即可 2. 若用户未登录,则跳转到登录页面,需要执行完登录操作(或取消)后才能获得结果,使用异步方式实现。 以打开订单列表页面前需要登录为例: 先定义用户组件,提供一个强制获取用户登录信息的功能,若未登录则打开登录界面,并在用户登录后返回登录结果(取消登录也是一种结果) //用户中心组件类public class UserCompo ...
一文看懂组件化框架CC的实现原理
前言首先说明一下,本文将讲述的组件化与业内的插件化(如:Atlas, RePlugin等)不是同一个概念 【图片来源于网络】 组件化开发:就是将一个app分成多个Module,每个Module都是一个组件(也可以是一个基础库供组件依赖),开发的过程中我们可以单独调试部分组件,组件间不需要互相依赖,但可以相互调用,最终发布的时候所有组件以lib的形式被主app工程依赖并打包成1个apk。 插件化开发:和组件化开发略有不用,插件化开发时将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk(组件化的每个模块是个lib),最终打包的时候将宿主apk和插件apk(或其他格式)分开或者联合打包。 本文将主要就以下几个方面进行介绍: 一、为什么需要组件化? 二、CC技术要点 三、CC执行流程详细解析 一、为什么需要组件化?关于使用组件化的理由,上网能搜到很多,如业务隔离、 ...
CC框架实践(3): 让jsBridge更优雅
前言jsBridge是作为js和java之间通信的桥梁,本身它的职责只是完成通信。 本文不是介绍js与java通信过程的实现,你可以使用第三方库(如:JsBridge),也可以自己来实现,或者用addJavascriptInterface,都可以。本文的侧重点是如何让我们的jsBridge不那么臃肿,实现得更优雅,更利于维护。 但在实际封装过程中,会发现需要我们需要解决很多耦合的问题: js调用的功能在其他module中,如何调用到这些功能,如何向jsbridge注册这些功能? jsbridge依赖了太多module,怎么解耦? 当js调用的功能是打开其它页面获取该页面处理后的结果并回调给js,怎么破? onResume? startActivityForResult? 一个常见的场景是:打开登录界面,登录成功后将用户信息回调给js。你是不是想过这样做? jsBridge中封装一个Act ...
CC框架实践(2):Fragment和View的组件化
一、需求背景在android组件化过程中,你有没有遇到这样的问题: 单Activity + 多Fragment的架构下,如何进行Fragment的组件化? 主界面上的Fragment太多,想用组件化进行管理,该怎么做? 一个功能模块比较独立,但在主界面使用了其中一个Fragment,如何解耦? 对某些View进行了封装或者自定义的View,功能比较独立,是作为基础库通过类依赖使用好还是作为组件使用比较好?如果要作为组件使用,那要如何组件化? 二、现有的一些解决方案: 在主app中依赖所有组件,所以在主app中可直接使用这些组件中的Fragment或View的类 直接使用具体的类将产生耦合,违背了组件化的解耦目的 组件之间的fragment引用也需要直接依赖,这样就变成了一个库而非组件 使用ARouter来获取Fragment对象来实现Fragment组件化 由于没有Fragment ...
可能否?渐进式组件化改造
项目大了,编译慢了,开发效率低了,怎么办?也许你已经知道了组件化,但项目迭代任务紧张,根本没有时间进行整体解耦,更害怕一下子改动太大导致的风险不可控,不敢大改,怎么办? 先别急着放弃,渐进式组件化了解一下 背景故事在实行组件化改造之前,我们对业内的一些技术文章及开源库进行调研之后,发现基本上千篇一律地都是基于路由这种方案作为通信引擎来实现组件化,重要的是组件化之前得先解耦原来的项目代码。很尴尬,我们没那么人力和时间来一下子做这么一大块事情。这时候我们是这样想的: 可不可以先不解耦? 这个问题问得好,不先解耦,组件怎么单独以app运行呢? 新业务新module可以无耦合,总可以单独运行调试了吧? 组件需要登录怎么办? 需要跟其它组件通信怎么办? 用URLScheme来跨app通信总可以了吧? 页面跳转还行,虽然有个中转页面,仅在开发期间使用勉强也能接受 但如何获取服务?那可是要查找接口的实现 ...
CC框架实践(4): 登录状态监听功能的实现
前言在CC框架中,普通的组件调用类似于Http请求,是一对一的主动调用 但有时我们需要监听其它组件的某些状态,例如登录状态监听和下载进度监听 本文将以更为典型的登录状态监听为例来介绍如何在CC框架下实现此功能。 动态组件介绍在CC架构下,实现IDynamicComponent接口的类就是动态组件 动态组件需要手动注册和注销 详细介绍请戳 这里 用动态组件来实现登录状态监听按以下步骤实现即可 创建用于监听登录状态的动态组件 在登录组件新增2个服务: 添加登录状态监听,接收动态组件的组件名称和action名称作为参数 注销登录状态监听,接收动态组件的组件名称作为参数 在登录组件中,登录状态发生变化时通知所有正在监听的动态组件 将封装好的动态组件应用到BaseActivity/BaseFragment中 在BaseActivity/BaseFragment子类中使用登录状态功能,更便捷 ...