common_business.gradle中一键依赖
apply from: rootProject.file(“library_base.gradle”)
dependencies {
.…
implementation project(“:uikit:uikit”)
}
UI组件独立编译
uikit/shell/settings.gradle
include ‘:app’
includeModule(‘widget’,‘…/’)
includeModule(‘demo’,‘…/’)
includeModule(‘flatbutton’,‘…/’)
includeModule(‘imgselector’,‘…/’)
includeModule(‘photodraweeview’,‘…/’)
includeModule(‘roundview’,‘…/’)
includeModule(‘uikit’,‘…/’)
includeModule(‘widgetlayout’,‘…/’)
includeModule(‘dialog’,‘…/’)
includeModule(‘statusbar’,‘…/’)
includeModule(‘toolbar’,‘…/’)
def includeModule(name, filePath = name) {
def projectDir = new File(filePath+name)
if (projectDir.exists()) {
include ‘:uikit:’ + name
project(‘:uikit:’ + name).projectDir = projectDir
} else {
print(“settings:could not find module $name in path $filePath”)
}
}
UI组件lib的build.gradle中
if (rootProject.ext.is_in_uikit_project) {
apply from: rootProject.file(‘…/uikit.gradle’)
} else {
apply from: rootProject.file(‘uikit/uikit.gradle’)
}
这样就实现了宿主工程UIKit代码单独运行的效果了
组件可以分为2类:工具型、业务类型,2个类型的组件迭代思路差异非常的大,工具型组件,只要单点做到极致就ok了,整体比较简单,复用性也比较强,而业务型组件就会稍显复杂,既要考虑复用性,也要考虑可扩展性,下面分别介绍这2个类型组件的实现思路
工具型
工具型组件迭代的思路就是不断的完善基础能力,尽可能的功能全面,在已有的能力上不断的支持新的功能,比较重要的就是兼容已有api,比较代表性的组件有FlatButton、RoundView、StatusBar,可以参考下FlatButton&RoundView迭代历程:
业务型
如何做好一个业务组件呢,实现可以是具象的,也可以是抽象的,好的组件设计应该是2者兼备,最底层的实现应该是足够抽象,而上层实现又应该是具象的,所以需要带着容器化的思路来实现,那么怎么个思路呢,如下图:
下面以FlatButton为例介绍组件实现方式,其它组件实现思路类似。在实现前,我们先看下视觉稿
按钮样式特别多,实现方式也可以有很多种,现有工程也给出了实现方案,具体如下:
第一步:分别定义noraml下的shape和pressed的shape,如果enable = false,还得再定义一个dissable的shape
normal (ui_standard_bg_btn_corner_28_ripple)
<?xml version="1.0" encoding="utf-8"?><ripple xmlns:android=“http://schemas.android.com/apk/res/android”
android:color=“@color/button_pressed_cover”>
<item
android:drawable=“@drawable/ui_standard_bg_btn_corner_28_enable”>
pressed(ui_standard_bg_btn_corner_28_disable)
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android=“http://schemas.android.com/apk/res/android”
android:shape=“rectangle”>
<gradient
android:angle=“0”
android:endColor=“@color/button_disable_end”
android:startColor=“@color/button_disable_start”
android:useLevel=“false”
android:type=“linear” />
第二步:定义selector
selector(ui_standard_bg_btn_corner_28)
<?xml version="1.0" encoding="utf-8"?>第三步:使用
<TextView
…
android:background=“@drawable/ui_standard_bg_btn_corner_28”
android:textColor=“@color/white”/>
这样按钮的背景按压就实现了,如果在此基础上,文字也需要按压态,那么就重复上面的步骤,对颜色再创建一个选择器,当实现完上面UI定义的样式后,工程中的画风如下:
我是谁,我在哪里,这该怎么玩,长得都差不多,基本没有开发体验,复用性、扩展性都非常的差,如果来个UI大改版,又得从头再来一次。那怎么解决上面的问题呢,答案是定义按钮通用能力,业务上层再实现,按这个思路做,需要删除上面所有shape、selector,然后自定义控件,我们都知道,上面定义的shape、selector xml文件,android系统最终都是会解析生成对应的对象,所以我们借鉴一下系统代码,实现起来就so easy
看下这个shape xml
<shape xmlns:android=“http://schemas.android.com/apk/res/android”
android:shape=“rectangle”>
<gradient
android:angle=“0”
android:endColor=“@color/button_disable_end”
android:startColor=“@color/button_disable_start”
android:useLevel=“false”
android:type=“linear” />
解析后的对象为GradientDrawable
public void setOrientation(Orientation orientation)
public void setColors(@Nullable @ColorInt int[] colors)
public void setCornerRadii(@Nullable float[] radii)
public void setStroke(int width, @ColorInt int color)
…
也就是说,xml中定义的属性,代码中都可以实现,除了GradientDrawable,还会用到RippleDrawable实现水波纹,同理文字颜色选择器代码中对应的为ColorStateList,有了上面铺垫,具体实现如下:
第一步:定义自定义属性
第二步:核心实现逻辑
private fun setBackgroundCompat() {
val stateListDrawable = createStateListDrawable()
val pL = paddingLeft
val pT = paddingTop
val pR = paddingRight
val pB = paddingBottom
background = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && isRippleEnable) {
val rippleDrawable = RippleDrawable(createRippleColorStateList(), stateListDrawable, null)
rippleDrawable
} else {
stateListDrawable
}
setPadding(pL, pT, pR, pB)
}
private fun createStateListDrawable(): StateListDrawable {
var normalDrawable = StateListDrawable()
normalDrawable.addState(
intArrayOf(android.R.attr.state_pressed),
createPressedDrawable()
)
normalDrawable.addState(
intArrayOf(android.R.attr.state_focused),
createPressedDrawable()
)
normalDrawable.addState(
intArrayOf(-android.R.attr.state_enabled),
createDisableDrawable()
)
normalDrawable.addState(
intArrayOf(android.R.attr.state_selected),
createPressedDrawable()
)
normalDrawable.addState(intArrayOf(), createNormalDrawable())
return normalDrawable
}
private fun createRippleColorStateList(): ColorStateList {
val stateList = arrayOf(intArrayOf(android.R.attr.state_pressed), intArrayOf(android.R.attr.state_focused), intArrayOf(android.R.attr.state_activated), intArrayOf())
val normalColor = backgroundStyle.getColorRippleNormalFallback()
val pressedColor = backgroundStyle.getColorRipplePressedFallback()
val stateColorList = intArrayOf(
pressedColor,
pressedColor,
pressedColor,
normalColor
)
return ColorStateList(stateList, stateColorList)
}
第三步:UI组件实现
xml中使用
<com.snapsolve.uikit.flatbutton.FlatButton
app:fb_colorNormalText=“@color/uikit_color_white”
app:fb_colorPressedText=“@color/uikit_color_white”
app:fb_colorNormalEnd=“#FF9800”
app:fb_colorNormalStart=“#FF0000”
app:fb_colorPressedEnd=“#4CAF50”
app:fb_colorPressedStart=“#009688”
app:fb_colorRippleNormal=“#303F9F”
app:fb_colorRipplePressed=“#FF4081”
app:fb_cornerRadius=“24dp”
app:fb_gradientOrientation=“left_right”
app:fb_isRippleEnable=“true”
…
/>
代码中使用
fb_radius_in_code.setBackgroundStyle {
this.colorNormal = resources.getColor(R.color.uikit_color_FF4081)
this.colorPressed = resources.getColor(R.color.uikit_color_9C27B0)
this.colorRippleNormal = resources.getColor(R.color.uikit_color_FF4081)
this.colorRipplePressed = resources.getColor(R.color.uikit_color_9C27B0)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/12db7eec4b35162f8c5ef6c954893e13.jpeg)
最后
想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
CvhUApsh-1713413195660)]
[外链图片转存中…(img-IIA6yv56-1713413195661)]
[外链图片转存中…(img-akoHpjE1-1713413195663)]
[外链图片转存中…(img-Tp6UMz6q-1713413195664)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/12db7eec4b35162f8c5ef6c954893e13.jpeg)
最后
想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!