当前位置: 首页 > news >正文

Android 自定义View一

1.继承已有VIew,改写尺寸:重写onMeasure

  SquareImageView

2.完全自定义重写onMeasure

3.自定义Layout 重写onMeasure onLayout

1.继承已有VIew,改写尺寸:重写onMeasure

流程:

重写onMeasure

用getmeasureedWidth getMeasuredHeight获取测量尺寸

计算最终尺寸

setMeasuredDissmension(w,h)保存结果

getMeasuredWidth getMeasuredHeight 测量期望尺寸,在测量过程中使用(提前取)

getWidth = right -left, geiHeight = bottom-top 实际尺寸,在非测量过程使用(更准确)

onMeasure 测量 根据自身测量和父VIew约束进行判断 ATMODE EX.....

val width = when(specMode) {MeasureSpec.EXACTLY -> specSize//精确MeasureSpec.AT_MOST -> if ( size > specSize) specSize else size//约束,大于else -> size //不限制
}在kotlin 等同于下面写法,更加简洁
val width1 = resolveSize(size,widthMeasureSpec)

resolveSize 、 resolveSizeAndState  区别: 结果是一样的

还有 resolveSizeAndState  在进行自身测量和父布局给出的大小不一致时,会标记SALL,MASK,然后给父VIew一个值,父VIew会拿到结果进行重新测量

tips:很多系统ViewGroup大多数不会去读resolveSizeAndState 的TO_SMALL 等标志位

源码:

package com.example.myapplication.viewimport android.content.Context
import android.util.AttributeSet
import android.widget.ImageView
import androidx.appcompat.widget.AppCompatImageView
import kotlin.math.minclass SquareImageView(context : Context,attributeSet: AttributeSet) : AppCompatImageView(context,attributeSet){//    override fun layout(l: Int, t: Int, r: Int, b: Int) {
//
//        val width = r-l
//        val height = b-t
//        val size = min(width,height)
//        super.layout(l, t, l+size, t+size)
//    }override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)val size = min(measuredWidth,measuredHeight)setMeasuredDimension(size,size)}
}

package com.example.myapplication.viewimport android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import android.view.Viewclass CircleView(context: Context,attributeSet: AttributeSet) :View(context,attributeSet) {private var paint = Paint(Paint.ANTI_ALIAS_FLAG)private val RADIUS = 300fprivate val PADING = 300foverride fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {val size = ((PADING + RADIUS) * 2).toInt()val specMode =  MeasureSpec.getMode(widthMeasureSpec)val specSize = MeasureSpec.getSize(widthMeasureSpec)val width = when(specMode) {MeasureSpec.EXACTLY -> specSize//精确MeasureSpec.AT_MOST -> if ( size > specSize) specSize else size//约束,大于else -> size //不限制}val width1 = resolveSize(size,widthMeasureSpec)val height1 = resolveSize(size,heightMeasureSpec)setMeasuredDimension(width1,height1)}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)canvas.drawCircle(PADING + RADIUS,PADING + RADIUS,RADIUS,paint)}
}
http://www.lryc.cn/news/215812.html

相关文章:

  • 11、电路综合-集总参数电路结构的S参数模型计算与Matlab
  • 计算机网络--真题
  • java毕业设计基于ssm的招聘求职网站
  • 【JavaEE初阶】 初识网络原理
  • LeetCode题解:993. 二叉树的堂兄弟节点,BFS,JavaScript,详细注释
  • 在python中加载tensorflow-probability模块和numpy模块
  • t2017递推2猴子摘桃
  • 呼吸灯【FPGA】
  • Codeforces 1855E 数学期望 + DP
  • 5-1CComplex运算符重载为友元
  • Vue3.0 watch和watchEffect监听器:VCA
  • 1360. 日期之间隔几天
  • ubuntu配置 Conda 更改默认环境路径
  • 华山编程培训中心——工业相机飞拍
  • linux 释放缓存命令并做成定时任务
  • 求解一个整数中含多少个1
  • js编写一个函数判断所有数据类型
  • Python对于时间相关模块的学习记录(time,datetime等模块)
  • 【C#】获得所有可见窗口信息
  • ffmpeg的基本功能介绍
  • QECon大会亮相产品,支持UI自动化测试?RunnerGo
  • Linux开关机相关的命令解析
  • C++二分查找算法的应用:俄罗斯套娃信封问题
  • redis如何保证和mysql数据的一致性
  • SpringBoot整合Redisson,赶紧整起来!
  • 测试Whisper效果
  • Seata 四种事务模式
  • 超好用的IDEA插件推荐,写完代码直接调试接口
  • 发送post请求、携带cookie、响应对象、高级用法
  • JMeter接口测试性能测试