前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Kotlin】Kotlin 自定义组件 ( 自定义 View | 自定义 SurfaceView )

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

作者头像
韩曙亮
发布2023-03-28 16:24:54
1.4K0
发布2023-03-28 16:24:54
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

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

一、自定义 View 组件 ( Kotlin )


代码语言:javascript
复制
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 )


代码语言:javascript
复制
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?) {
    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、自定义 View 组件 ( Kotlin )
  • 二、自定义 SurfaceView 组件 ( Kotlin )
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档