初学Kotlin——在自定义View里的应用,安卓ndk开发书籍

}

Kotlin你可以实现的更简洁

class BarChart @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
View(context, attrs, defStyleAttr) {

private val mContext: Context = context

init { }

你可以在init代码块里面获得构造函数的传参,当然你也可以直接在声明属性的时候获得,@JvmOverloads 如果你没有加上这个注解,它只能重载相匹配的的构造函数,而不是全部。

而且可能你也发现了,你可以在传参里面初始化,这相对于Java来说,灵活太多

fun shadow(width:Int=100,height:Int = 180){ }
//你可以这么使用
shadow()
shadow(140)
shadow(140,200)

4.UI布局

一般用我们创造view的布局是xml,Kotlin也是支持的,但是它更推荐你使用Anko的布局方式。

那是什么是Anko呢,AnkoJetBrains开发的一个强大的库,它主要的目的是用来替代以前xml的方式来使用代码生成UI布局的,它包含了很多的非常有帮助的函数和属性来避免让你写很多的模版代码。

有兴趣的你可以去看看它的源码与更多使用方式 – Anko

首先你要在Gradle里添加Anko的引用

// Anko Layouts
compile “org.jetbrains.anko:anko-recyclerview-v7: a n k o v e r s i o n " c o m p i l e " o r g . j e t b r a i n s . a n k o : a n k o − r e c y c l e r v i e w − v 7 − c o r o u t i n e s : anko_version" compile "org.jetbrains.anko:anko-recyclerview-v7-coroutines: ankoversion"compile"org.jetbrains.anko:ankorecyclerviewv7coroutines:anko_version”
compile “org.jetbrains.anko:anko-sdk25: a n k o v e r s i o n " c o m p i l e " o r g . j e t b r a i n s . a n k o : a n k o − a p p c o m p a t − v 7 : anko_version" compile "org.jetbrains.anko:anko-appcompat-v7: ankoversion"compile"org.jetbrains.anko:ankoappcompatv7:anko_version”
// Coroutine listeners for Anko Layouts
compile “org.jetbrains.anko:anko-sdk25-coroutines: a n k o v e r s i o n " c o m p i l e " o r g . j e t b r a i n s . a n k o : a n k o − a p p c o m p a t − v 7 − c o r o u t i n e s : anko_version" compile "org.jetbrains.anko:anko-appcompat-v7-coroutines: ankoversion"compile"org.jetbrains.anko:ankoappcompatv7coroutines:anko_version”

然后你可以在代码里写UI布局的代码了,就是用Kotlin代码替代xml

private fun createView(attrs: AttributeSet? = null, defStyleAttr: Int = 0) {

var height = dip(150)
attrs?.let {
val typeArray = mContext.obtainStyledAttributes(it, R.styleable.BarChartView, defStyleAttr, 0)
height = typeArray.getDimension(R.styleable.BarChartView_chart_height, dip(150).toFloat()).toInt()
typeArray.recycle()
}

verticalLayout {
lparams(width = matchParent, height = matchParent)

frameLayout {
lparams(width = matchParent, height = wrapContent)

mLineView = view {
backgroundColor = R.color.gray_light
}.lparams(width = matchParent, height = dip(0.5f)) {
gravity = Gravity.BOTTOM
bottomMargin = dip(9)
}

mBarView = recyclerView {
lparams(width = matchParent, height = height)
}
}

mDateView = relativeLayout {
lparams(width = matchParent, height = wrapContent) {
leftPadding = dip(10)
rightPadding = dip(10)
}

mLeftTv = textView {
textSize = 15f
}

mRightTv = textView {
textSize = 15f
}.lparams(width = wrapContent, height = wrapContent) {
alignParentRight()
}
}
}
}

可以从代码里看见verticalLayout(其实就是LinearLayoutvertical模式)包裹了frameLayoutrelativeLayout,里面又有各自的子view,而且你会发现xml有的属性这里也有,调用起来非常的简洁明了,熟练xml的来写这个,我觉得上手应该会很快,它的缺点就是没有预览效果,以及实现复杂的view结构的时候会比较繁琐,考验盲写的功力了。。。。

5.扩展函数

扩展函数是Kotlin非常方便实用的一个功能,它可以让我们随意的扩展SDK的库,你如果觉得SDK的api不够用,这个时候你可以用扩展函数完全去自定义。

例如你需要这样来获取颜色,每次你都需要一个上下文context

mColor = ContextCompat.getColor(mContext, R.color.primary)

那你可以通过扩展Context这个SDK的类来实现更方便的使用

fun Context.color(colorRes: Int) = ContextCompat.getColor(this, colorRes)
fun View.color(colorRes: Int) = context.color(colorRes)

而且为了更方便在View里面使用,又扩展了View。在第一个方法里面可以发现getColor所需要的this上下文,就是Context。同样,View里面的contextgetContext()所得到,也就是View里面本身具有的公有方法。

这其实是很惊艳的功能

那我们可以想一想为啥可以这样做,我们知道的是KotlinJava都是在Jvm上运行的,既然都是编译成class字节码,那我们是不是可以通过字节码来了解一些事情。

通过Android studio 3.0上的Tools的工具Show Kotlin Bytecode,可以将刚才的扩展函数的代码编译成字节码

// access flags 0x19
public final static color(Landroid/content/Context;I)I
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
L0
ALOAD 0
LDC “$receiver”
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
L1
LINENUMBER 12 L1
ALOAD 0
ILOAD 1
INVOKESTATIC android/support/v4/content/ContextCompat.getColor (Landroid/content/Context;I)I
IRETURN
L2
LOCALVARIABLE $receiver Landroid/content/Context; L0 L2 0
LOCALVARIABLE colorRes I L0 L2 1
MAXSTACK = 2
MAXLOCALS = 2

// access flags 0x19
public final static color(Landroid/view/View;I)I
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
L0
ALOAD 0
LDC “$receiver”
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
L1
LINENUMBER 14 L1
ALOAD 0
INVOKEVIRTUAL android/view/View.getContext ()Landroid/content/Context;
DUP
LDC “context”
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkExpressionValueIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
ILOAD 1
INVOKESTATIC shadow/barchart/ExtensionsKt.color (Landroid/content/Context;I)I
IRETURN
L2
LOCALVARIABLE $receiver Landroid/view/View; L0 L2 0
LOCALVARIABLE colorRes I L0 L2 1
MAXSTACK = 3
MAXLOCALS = 2

这就是编译后的字节码,看不懂是吧,我也看不懂。。但是我们可以反编译啊,生成Java代码

public static final int color(@NotNull Context KaTeX parse error: Expected '}', got 'EOF' at end of input: …meterIsNotNull(receiver, " r e c e i v e r " ) ; r e t u r n C o n t e x t C o m p a t . g e t C o l o r ( receiver"); return ContextCompat.getColor( receiver");returnContextCompat.getColor(receiver, colorRes);
}

public static final int color(@NotNull View KaTeX parse error: Expected '}', got 'EOF' at end of input: …meterIsNotNull(receiver, “$receiver”);
Context var10000 = $receiver.getContext();
Intrinsics.checkExpressionValueIsNotNull(var10000, “context”);
return color(var10000, colorRes);
}

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

Android学习PDF+架构视频+面试文档+源码笔记

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

真题解析】**

[外链图片转存中…(img-3fBB7m05-1646484390152)]

【算法合集】

[外链图片转存中…(img-M41ExSWJ-1646484390154)]

【延伸Android必备知识点】

[外链图片转存中…(img-ednIXAuj-1646484390154)]

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin自定义 View 的步骤与 Java 中基本相同。下面是一个简单的自定义 View 的示例: 1. 创建一个新的 Kotlin 类,扩展自 View 类。 ``` class MyCustomView(context: Context, attrs: AttributeSet?) : View(context, attrs) { // View 的绘制代码将在这添加 } ``` 2. 实现 `onMeasure()` 方法来定义 View 的大小。在这个方法中,使用 `setMeasuredDimension()` 方法来设置 View 的宽度和高度。 ``` override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) val desiredWidth = 100 // 期望的宽度 val desiredHeight = 100 // 期望的高度 val widthMode = MeasureSpec.getMode(widthMeasureSpec) val widthSize = MeasureSpec.getSize(widthMeasureSpec) val heightMode = MeasureSpec.getMode(heightMeasureSpec) val heightSize = MeasureSpec.getSize(heightMeasureSpec) val width = when (widthMode) { MeasureSpec.EXACTLY -> widthSize MeasureSpec.AT_MOST -> min(desiredWidth, widthSize) else -> desiredWidth } val height = when (heightMode) { MeasureSpec.EXACTLY -> heightSize MeasureSpec.AT_MOST -> min(desiredHeight, heightSize) else -> desiredHeight } setMeasuredDimension(width, height) } ``` 3. 实现 `onDraw()` 方法来绘制 View。在这个方法中,可以使用 Canvas API 来绘制所需的视图元素。 ``` override fun onDraw(canvas: Canvas) { super.onDraw(canvas) // 绘制一个圆形 val centerX = width / 2f val centerY = height / 2f val radius = min(centerX, centerY) canvas.drawCircle(centerX, centerY, radius, Paint().apply { color = Color.BLUE style = Paint.Style.FILL }) } ``` 4. 在 XML 布局文件中添加自定义 View。 ``` <com.example.MyCustomView android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 这样就完成了一个简单的自定义 View。当然,这只是一个简单的示例,实际上自定义 View 的实现可能会更加复杂,具体实现方式取决于您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值