【Kotlin】Kotlin 自定义组件 ( 自定义 View | 自定义 SurfaceView )

简介: 【Kotlin】Kotlin 自定义组件 ( 自定义 View | 自定义 SurfaceView )

文章目录

一、自定义 View 组件 ( Kotlin )

二、自定义 SurfaceView 组件 ( Kotlin )


自定义组件构造函数统一在 constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) 构造函数中实现 , 在 constructor(context: Context?) , constructor(context: Context?, attrs: AttributeSet?) 构造函数中 , 都基于三个参数的构造函数 ;






一、自定义 View 组件 ( Kotlin )


package kim.hsl.aa.view
import android.content.Context
import android.graphics.Canvas
import android.os.Build
import android.util.AttributeSet
import android.view.View
import androidx.annotation.RequiresApi
class MyView : View {
    val TAG: String = "MyView"
    constructor(context: Context?) : this(context, null, 0)
    constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : 
      super(context, attrs, defStyleAttr)
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : 
      super(context, attrs, defStyleAttr, defStyleRes)
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        // 绘制核心方法
    }
}




二、自定义 SurfaceView 组件 ( Kotlin )


package kim.hsl.aa.view
import android.content.Context
import android.graphics.*
import android.os.Build
import android.util.AttributeSet
import android.view.SurfaceHolder
import android.view.SurfaceView
import androidx.annotation.RequiresApi
import kim.hsl.aa.R
class MySurfaceView : SurfaceView, SurfaceHolder.Callback, Runnable {
    val TAG = "MySurfaceView"
    /**
     * 渲染绘制标志
     */
    private var mDrawingFlag = false
    /**
     * 渲染线程
     */
    private var mRender: Thread? = null
    /**
     * 画布
     */
    private var mCanvas: Canvas? = null
    constructor(context: Context) : this(context, null, 0)
    constructor(context: Context, attrs : AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr : Int) :
            super(context, attrs, defStyleAttr) {
        holder.addCallback(this)
        setZOrderOnTop(true)
        holder.setFormat(PixelFormat.TRANSLUCENT)
    }
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr : Int, defStyleRes: Int) :
            super(context, attrs, defStyleAttr, defStyleRes)
    override fun run() {
        val paint = Paint()
        while (mDrawingFlag) {
            paint.setColor(Color.WHITE)
            mCanvas = holder.lockCanvas()
            if (mCanvas == null) continue
            mCanvas?.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
            //TODO 绘制逻辑
            holder.unlockCanvasAndPost(mCanvas)
            Thread.sleep(20)
        }
    }
    /*
        下面的三个函数是 实现 SurfaceHolder.Callback 接口方法
     */
    override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
        mDrawingFlag = true
        mRender = Thread(this)
        mRender?.start()
        // 加载图片
        var bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
    }
    override fun surfaceDestroyed(holder: SurfaceHolder?) {
    }
    override fun surfaceCreated(holder: SurfaceHolder?) {
    }
}


目录
相关文章
|
设计模式 前端开发 调度
Android体系课之--Kotlin协程进阶篇-协程在Android组件中的使用(四)
1.协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器!)上调度执行,而代码则保持如同顺序执行一样简单。 2.协程是一种并发设计模式,您可以在Android平台上使用它来简化异步执行的代码
|
网络协议 Java Android开发
基于Kotlin实现一个简单的TCP自定义协议
一. 开发背景 想要成为一名优秀的Android开发,你需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~。
基于Kotlin实现一个简单的TCP自定义协议
|
网络协议 Java Kotlin
基于 Kotlin + Netty 实现一个简单的 TCP 自定义协议
基于 Kotlin + Netty 实现一个简单的 TCP 自定义协议
583 0
|
JavaScript API Android开发
今天Kotlin 1.3正式发布:支持协程和多平台组件
image 今天,Kotlin 官方博客正式发布了 Kotlin 1.3,还附带了一些开源库、构建工具和学习资源。 在这次更新中,协程(Coroutines)特性已经稳定,它使得非阻塞代码易于读写,Kotlin 1.3 还带来了 Kotlin / Native Beta,它可将 Kotlin 代码直接编译为本机二进制文件,此外,Kotlin 的跨平台功能将为 Android 和 iOS 应用程序等组件之间共享业务逻辑,服务器也可以与 Web 和移动客户端共享逻辑,而且多平台库让日常的开发变得便捷。
2046 0
|
Kotlin
使用 Kotlin Script 自定义实现项目开发脚手架
类似 nowa init mod nowa init page 使用命令: rok init -e=${Entity} -p=${package} 自动生成Entity, package ${package}.
1263 0
|
安全 前端开发 Java
【Kotlin Spring Boot 服务端开发: 问题集锦】 Spring Security : 自定义AccessDeniedHandler 处理 Ajax 请求
【Kotlin Spring Boot 服务端开发: 问题集锦】 Spring Security : 自定义AccessDeniedHandler 处理 Ajax 请求 AccessDeniedHandler 接口定义: package org.
3419 0
|
6月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
276 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
349 1
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
465 1
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
522 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?

热门文章

最新文章