1 View 的本质
View 组件知识一个矩形的空白区域,View 组件没有任何内容。对于Android应用的其他UI组件来说,他们都继承自View,然后在View 组件提供的空白区域绘制外观
2 开发自定义View的方法
要开发自己的UI组件,其实就是要定义一个继承自View基类的子类,然后重写View类的一个或多个方法。通常可以被用户重写的方法如下:
构造器:重写构造器是定制View的最基本方式,当Kotlin或JAVA代码创建一个View实例,将需要调用构造器。
onFinishInflate():这是一个回调方法,当应用从XML布局文件加载该组件并利用它来构建界面之后,该方法将会被回调
onMeasure(int,int):调用该方法来检测View组件及其所包含的所有子组件的大小
onLayout(boolean,int,int,int,int):当改组件需要分配其子组件的位置、大小时,该方法就会被回调。
onSizeChanged(int,int,int,int):当改组件的大小被改变时回调该方法
onDraw(Canvas):当该组件将要绘制他的内容是回调该方法
onKeyDown(int,KeyEvent):当某个键被按下时触发该方法
onkeyUp(int,KeyEvent):当松开某个键时触发该方法
onTrackballEvent(MotionEvent):当发生轨迹球事件时触发该方法
onTouchEvent(MotionEvent):当发生触摸屏事件时触发该方法
onFoucsChanged(boolean gainFocus,int direction,Rect previouslyFocusedRect):当改组件焦点发生改变时触发该方法
onWindowFocusChanged(boolean) :当包含该组件的窗口失去或得到焦点时触发该方法
onAttachdedToWindow():当把组件放入某个窗口中时触发该方法
onDetachedFromWindow():当把该组件从某个窗口中分离时触发该方法
onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发该方法。
3 实例:跟随手指的小球
该实例最终的效果是:手指点击屏幕的位置就会出现一个小球。
lesson2示例
下面代码先自定义一个绘制小球的组件:
DrawView.kt
package com.android.lesson2
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
class DrawView: View {
private var currentX = 40f
private var currentY = 50f
//定义并创建画笔
private var p = Paint()
constructor(context: Context):super(context)
constructor(context: Context, set: AttributeSet):super(context,set)
override fun onDraw(canvas: Canvas)
{
super.onDraw(canvas)
//设置画笔颜色
p.color = Color.RED
//绘制一个小圆
canvas.drawCircle(currentX,currentY,15F,p)
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
//修改currentX,currentY两个属性
if (event != null) {
currentX = event.x
}
if (event != null) {
currentY = event.y
}
//通知当前组件重绘自己
invalidate()
//返回true 表名该处理方法已经处理该事件
return true
}
}
上面的DrawView组件继承了View基类,并重写了onDraw方法--该方法负责在该组件的指定位置绘制小球。该组件还重写了onTouchEvent()方法,该方法用于处理该组件的触碰事件。
下面在该应用的activty_main.xml中加入该组件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main"
tools:context=".MainActivity">
<com.android.lesson2.DrawView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>