当前位置: 首页 > 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)}
}

相关文章:

Android 自定义View一

1.继承已有VIew,改写尺寸:重写onMeasure SquareImageView 2.完全自定义重写onMeasure 3.自定义Layout 重写onMeasure onLayout 1.继承已有VIew,改写尺寸:重写onMeasure 流程: 重写onMeasure 用getmeasureedWidth …...

11、电路综合-集总参数电路结构的S参数模型计算与Matlab

11、电路综合-集总参数电路结构的S参数模型 电路综合专栏的大纲如下: 网络综合和简化实频理论学习概述 前面介绍了许多微带线电路综合的实际案例,如: 3、电路综合原理与实践—单双端口理想微带线(伪)手算S参数与时域…...

计算机网络--真题

因特网上专门用于传输文件的协议是 因特网上专门用于传输文件的协议通常是 FTP(File Transfer Protocol)。FTP 是一种标准的网络协议,用于在计算机之间传输文件。它允许用户在客户端和服务器之间传输文件,上传文件到服务器或从服务…...

java毕业设计基于ssm的招聘求职网站

项目介绍 本前途招聘求职网站是针对目前仓库的实际需求,从实际工作出发,对过去的前途招聘求职网站存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确…...

【JavaEE初阶】 初识网络原理

文章目录 🌲网络发展史🚩独立模式🚩网络互连📌局域网LAN🎈基于网线直连🎈基于集线器组建🎈基于交换机组建🎈基于交换机和路由器组建 📌广域网WAN 🍀网络通信基…...

LeetCode题解:993. 二叉树的堂兄弟节点,BFS,JavaScript,详细注释

原题链接: https://leetcode.cn/problems/cousins-in-binary-tree/ 解题思路: 使用队列进行BFS搜索,同时保存每个节点,以及其深度和父节点信息。当搜索到x和y时,对比深度和父节点,如果满足要求&#xff0…...

在python中加载tensorflow-probability模块和numpy模块

目录 操作步骤: 注意: 问题: 解决办法: 操作步骤: 在虚拟环境的文件夹中,找到Scripts文件夹,点击进去,找到地址栏,在地址栏中输入cmd,进入如下界面。 输…...

t2017递推2猴子摘桃

2、猴子摘桃(nhoi2005xx1) Description 果园里种了很多桃树,当桃树开始结果的时候,猴子便会成群结队地前来摘桃。 猴子们第一天会摘掉桃子的一半还多一个,第二天再摘第一天剩下的一半还多一个,以后每天均摘掉上一天剩下的一半还…...

呼吸灯【FPGA】

晶振50Mhz 1us 等于 计0~49 1ms等于 0~999us 1s等于 0~999ms //led_outalways(posedge FPGA_CLK_50M_b5 or negedge reset_e8) //【死循环】敏感【触发条件:上升沿 clk】【运行副本】if(reset_e81b0)begin //50Mhz晶振, 49_999_999 是 1秒…...

Codeforces 1855E 数学期望 + DP

题意 传送门 Codeforces 1855E Expected Destruction 题解 将 S i S_i Si​ 运动至 S i 1 S_{i1} Si1​ 的情况看作后者消失,则 S i S_i Si​ 在碰到 S i 1 S_{i 1} Si1​ 前, S i 1 S_{i 1} Si1​ 必然存在。 根据数学期望的线性性质&…...

5-1CComplex运算符重载为友元

以下是一个用运算符重载为友元重载的方法重做复数加减法的运算&#xff0c;请填空完成程序。 #include <iostream> using namespace std; class CComplex { private:double real; double imag; public:CComplex(double r0.0,double i0.0){ real(r), imag(i)}friend…...

Vue3.0 watch和watchEffect监听器:VCA

简介 在项目中&#xff0c;有时候检测一个变量的值是否反升了变化。通常使用的watch或者使用低效的循环判断。 在次vue中给我们设置了深度监测数据繁盛变化的方法。 1.vue中提供了在watch监听时设置deep:true 就可以实现对对象的深度监听; 2.immediate:true,代表watch里面声明了…...

1360. 日期之间隔几天

1360. 日期之间隔几天 Java代码&#xff1a; 【DateFormat】DateFormat用于实现日期的格式化 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; // 好像已过时class Solution {public int daysBet…...

ubuntu配置 Conda 更改默认环境路径

我的需求是以后凡是新建一个虚拟环境都需要安装在一个挂载了大容量的分区/data里面 /home里面的是即将爆满但是还能塞点东西的硬盘. 如果您想要永久更改 Conda 的默认环境路径&#xff0c;可以编辑 Conda 的配置文件。首先&#xff0c;找到 Conda 的配置文件通常是 .condarc 文…...

华山编程培训中心——工业相机飞拍

飞拍功能是一种高速运动图像采集技术&#xff0c;通过降低相机的曝光时间来拍摄快速移动的对象&#xff0c;以提高工作效率和加快生产速度。下面视频演示工业相机飞拍&#xff1a; 上位机控制工业相机飞拍演示 一. 飞拍对相机硬件的要求 全局快门相机&#xff1a;飞拍要求相机…...

linux 释放缓存命令并做成定时任务

这个命令组合可以实现将待写入的数据同步到磁盘中&#xff0c;然后释放页面缓存。具体命令为&#xff1a; sync; echo 1 > /proc/sys/vm/drop_caches 第一个命令 sync 是将所有待写入磁盘的数据刷新到磁盘中&#xff0c;确保数据写入完成。第二个命令 echo 1 > /proc/…...

求解一个整数中含多少个1

1.问题描述&#xff1a;给定一个整数&#xff0c;统计其对应的二进制中含有1的个数。比如8(0000 1000),对应的二进制数中&#xff0c;只含有一个1. 2.设计思路&#xff1a;对x取余&#xff1a;zx%2。如果z&#xff01;0&#xff0c;说明x的末尾不是为1.对于一个二进制x4x3x2x1…...

js编写一个函数判断所有数据类型

一、typeof 在 JavaScript 里使用 typeof 来判断数据类型&#xff0c;只能区分基本类型&#xff0c;即 “number”&#xff0c;”string”&#xff0c;”undefined”&#xff0c;”boolean”&#xff0c;”object” 五种。 对于数组、对象来说&#xff0c;其关系错综复杂&…...

Python对于时间相关模块的学习记录(time,datetime等模块)

1&#xff0c;time.time&#xff08;&#xff09; 获得从计算机开始出生到现在的秒数(也成时间戳)&#xff0c;可以时间相减计算流逝时间 说明 &#xff1a;擅长时间相减计算流逝时间 导入方法 import time import time# 1&#xff0c;time.time 获得从计算机开始出生到…...

【C#】获得所有可见窗口信息

【背景】 由于自己的瘦客户端上的Windows自带截图软件功能被阉割&#xff0c;所以自己写了一个&#xff0c;其中有窗口截图功能&#xff0c;涉及到获得所有可见窗口的信息。 【代码】 public WindowInfo[] GetAllDesktopWindows(){//用来保存窗口对象 列表List<WindowInf…...

Shader Graph边缘光原理与实战:从菲涅尔效应到世界空间法线

1. 为什么边缘光不是“加个描边”那么简单——从美术需求到Shader本质的错位“给模型加个边缘光”&#xff0c;听起来像Unity编辑器里拖个组件、点几下鼠标就能搞定的事。我第一次接到这个需求时&#xff0c;美术同学在评审会上甩出一张《原神》角色截图&#xff0c;指着雷电将…...

Spring Cloud Feign本地调试路由增强方案设计与实现

1. 项目概述&#xff1a;当Feign遇上本地调试的“网络鸿沟”在微服务架构里混迹多年的老手&#xff0c;对OpenFeign这个组件肯定不陌生。它用起来确实爽&#xff0c;一个接口加几个注解&#xff0c;服务间的远程调用就像调用本地方法一样简单&#xff0c;把HTTP通信的复杂性都封…...

Gemini 访问要不要额外网络工具?国内直连体验怎么看

最近不少开发者开始把 Gemini 放进日常工作流里&#xff1a;查资料、写代码注释、整理技术方案、做内容大纲。但实际使用前&#xff0c;大家最关心的往往不是模型参数&#xff0c;而是“能不能顺畅访问”。如果只是想先体验模型能力&#xff0c;可以通过 库拉 这类 AI模型聚合平…...

在Nodejs后端服务中集成稳定可靠的大模型能力

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Nodejs后端服务中集成稳定可靠的大模型能力 应用场景类&#xff0c;针对需要构建智能对话或内容生成功能的后端工程师&#xff0…...

MySQL 高频面试题-01

在去面试之前&#xff0c;很多人天天背“八股文”&#xff0c;结果一到现场被面试官稍微一变形就问懵了。比如&#xff1a;“你天天说 B 树&#xff0c;那为什么不用 B 树&#xff1f;不用红黑树&#xff1f;它俩到底差在哪&#xff1f;”“既然索引能加速&#xff0c;那我把所…...

DeepSeek LeetCode 2488. 统计中位数为 K 的子数组 public int countSubarrays(int[] nums, int k)

这道题要求统计所有子数组中&#xff0c;中位数等于 k 的子数组个数。 核心思路&#xff1a; 先找到 k 在数组中的位置 pos中位数定义&#xff08;对于奇数长度&#xff09;&#xff1a;排序后中间的数 k等价转换&#xff1a;对于子数组&#xff0c;比 k 小的数个数 比 k 大的…...

ElevenLabs安徽话输出失真?3类高频崩溃场景+5行Python代码实时修复音频相位偏移

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ElevenLabs安徽话语音输出失真现象全景扫描 ElevenLabs 作为当前主流的高质量文本转语音&#xff08;TTS&#xff09;服务提供商&#xff0c;其多语言支持能力广受开发者青睐。然而&#xff0c;在面向中文方言…...

Burp Suite安装失败原因与Java环境精准配置指南

1. 为什么Burp Suite的安装总让人卡在第一步&#xff1f;——从“打不开”到“能用”的真实断点 你是不是也经历过&#xff1a;下载完Burp Suite官方压缩包&#xff0c;双击 burpsuite_pro.jar 没反应&#xff1f;或者弹出一句“找不到Java环境”就戛然而止&#xff1f;又或…...

免费编辑《上古卷轴》和《辐射》游戏3D模型的终极指南:NifSkope完整教程

免费编辑《上古卷轴》和《辐射》游戏3D模型的终极指南&#xff1a;NifSkope完整教程 【免费下载链接】nifskope A git repository for nifskope. 项目地址: https://gitcode.com/gh_mirrors/ni/nifskope 想要为你的《上古卷轴&#xff1a;天际》角色设计一套独特的盔甲吗…...

Unity背包系统设计终极指南:ScriptableObject+事件总线+对象池

1. 为什么“背包系统”不是功能模块&#xff0c;而是游戏世界的呼吸节奏 在Unity项目里&#xff0c;我见过太多团队把背包系统当成一个“做完就扔”的中间件&#xff1a;美术给图标、策划填Excel表格、程序写个List 塞进UI面板&#xff0c;跑通基础增删就打上✅。结果呢&#x…...