Android学习笔记(Kotlin实例版)--2-- 开发自定义View--实例:跟随手指的小球

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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值