View 自定义 - 不同的实现方式

Android实现自定义View的方法 没有进行View控件封装的后果就是代码冗余,阅读困难,而且View的功能如果要变动的话,所有调用的地方都得变动。我们重写了OnMeasure和OnDraw两个方法,前面也说到了,这两个方法是View绘制过程中用到的,可以按需重写,关于OnMeasure和OnLayout具体的内容这里就暂不详述了。左边的图片和右边的文字可以做成一个新的View控件,这样如果调用的地方多了,可以节省不少的代码量,因为实现的逻辑都在新的控件中处理了。//1.获取自定义View的宽度,高度的模式。 阅读详情

一、概念

1.2 自定义控件的不同实现方式

复用已有控件复用布局文件
组合现有的控件
扩展已有的控件继承特定的View(如TextView)
继承特定的ViewGroup(如LinearLayout)
完全自定义直接继承 View主要是实现 onMeasure() + onDraw(),因为没有子元素需要布局。
需要自己实现 wrap_content、padding,不需要自己实现 margin 该属性是由父容器决定的。
直接继承 ViewGroup主要是实现 onMeasure() + onLayout(),因为子元素都绘制好了父容器不需要额外绘制。
需要自己实现 wrap_content、padding、margin。
  • 对于 wrap_content 需要在 onMeasure() 中处理。

  • 对于自定义View,padding 是在 draw() 中处理。

  • 对于自定义ViewGroup,padding 和 margin 需要在 onMeasure() 和 onLayout() 中处理。

二、复用已有控件

2.1 复用布局文件

  1. 新建一个 layout_title.xml 文件,编写需要复用的布局。
  2. 在要使用的 activity_main.xml布局中,通过 <include layout="@layout/title" /> 引用。
  3. 在 MainActivity 中,可通过复用布局的实例 title.findViewById 查找 子View ID来拿到实例进行配置。

2.2 组合现有的 View 控件

  1. 新建一个 layout_title.xml 文件,将 view 控件组合起来。
  2. 新建一个TitleLayout.class,继承自LinearLayout,在 init{} 初始化代码块中通过 LayoutInflater 对布局文件进行加载和配置。
  3. 在要使用的 activity_main.xml布局中,通过完整包名引用。

layout_title.xml 

<LinearLayout>
    <Button...>
    <TextView...>
    <Button...>
</LinearLayout>

TitleLayout.class

class TitleLayout(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
    init {
        LayoutInflater.from(context).inflate(R.layout.layout_title, this)
        leftButton.setOnClickListener{
            val activity = context as Activity
            activity.finish()
        }
        titleText.text = "Title"
        rightButton.setOnClickListener {
            Toast.makeText(context, "Hello World", Toast.LENGTH_SHORT).show()
        }
    }
}

activity_main.xml

<LinearLayout>
    <com.example.TitleLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
<LinearLayout/>

三、扩展已有的控件

四、完全自定义

【RT-DETR有效改进】轻量级网络ShuffleNetV2(附代码+修改教程) 从今天开始正式开始更新RT-DETR剑指论文专栏,本专栏的内容会迅速铺开,在短期呢大量更新,价格也会乘阶梯性上涨,所以想要和我一起学习RT-DETR改进,可以在前期直接关注,本文专栏旨在打造全网最好的RT-DETR专栏为想要发论文的家进行服务。RT-DETR剑指论文专栏,持续复现各种顶会内容——论文收割机RT-DETR​​。 阅读详情

相关推荐

CST仿真提速秘籍:用好Local Mesh,别再让简单结构拖慢你的仿真速度

本文深入探讨了CST仿真中Local Mesh技术的应用,通过区域加密与全局排除策略,显著提升电磁仿真效率。针对5G天线阵列、微波滤波器等多尺度结构模型,提供了网格划分的黄金法则和实战技巧,帮助工程师优化仿真速度与精度,特别适用于电磁仿真和网格设置场景。

weixin_27134495的博客 406

Carson带你学Android:手把手教你写一个完整的自定义View

前言 自定义View是Android开发者必须了解的基础 今天,我将手把手教你写一个自定义View,并理清自定义View所有应该的注意点 阅读本文前,请先阅读我写的一系列自定义View文章 自定义View基础 - 最易懂的自定义View原理系列(1) 自定义View Measure过程 - 最易懂的自定义View原理系列(2) 自定义View Layout过程 - 最易懂的

Carson带你学Android 4万+

PyQt5混搭qfluentwidgets实战:用FramelessWindow快速打造现代化界面

本文详细介绍了如何将PyQt5与qfluentwidgets组件库结合,利用FramelessWindow快速打造现代化无边框界面。通过环境配置、核心特性解析、组件混用技巧及高级样式定制,帮助开发者提升桌面应用的用户体验和美观度,特别适合需要现代UI设计的Python开发者。

sugar的博客 969

android自定义View全解

源码在这里:优快云本文主要有以下内容: * 自定义View的分类 * 自定义View的注意事项 * 自定义View的实现 * 自定义View使其支持wrap_content和padding * 自定义属性的实现过程首先,自定义View是为了达到更绚丽的效果。它相对来说也是一个比较难的技术体系,涉及到【View的层次结构】、【View事件分发机制】、【View的工作原理】、【View的弹性

jasonpeak的专栏 5586

PCB设计必看:铜皮厚度与载流能力对照表(附Excel计算工具)

本文深入解析了PCB设计中铜皮厚度与载流能力的核心关系,提供了基于IPC-2152标准的动态计算逻辑与实用Excel工具。文章不仅分享了载流对照表,更重点剖析了影响载流能力的关键因素(如铜厚、线宽、温升、布线层),并给出了高电流设计的实战技巧与测试验证方法,帮助工程师规避常见陷阱,实现从理论到实践的闭环设计。

weixin_29228781的博客 724

【Arduino】入门篇——交通信号灯

模拟交通信号灯一、实验目的二、实验材料三、电路图四、实验过程五、代码块六、实验结果 一、实验目的 我想大家都看见过交通灯,就是马路上十字路口的红绿灯。如果您开过车,我想您一定仔细观察过交通灯,如果您还没有驾驶过车,您是否仔细观察过交通灯呢?交通灯包括三种个不同颜色的灯:红灯、黄灯和绿灯。 每个路口的红绿灯切换的时间并不是相同,这个是根据不同路口的车流情况来设定的,下面就是模仿交通灯的一个实验 二...

漠宸离若的博客 1万+

【自定义View】1.View的滑动

【难度★☆☆☆☆】自定义View是我们成为高级工程师的必经之路,尤其是创业公司,更需要自定义View,许多都以新奇的交互来制胜,比如探探的卡片滑动效果。如果说自定义View要从哪开始学起,那么滑动就是一个很好的选择。

liyafeng的博客 623

开发者体验度量:构建DevEx评估体系的方法论与工具

在深入讨论度量方法前,我们需要明确什么是开发者体验(DevEx)。许多人将其简化为"开发工具好不好用",这是一个危险的误解。开发者体验是指开发者在完成工作过程中的整体感受和效率,它由三大核心维度组成:工具与基础设施:开发、测试、部署工具链的效能流程与协作:工作流程的顺畅度和团队协作的效率文化与成长:支持实验、学习和专业发展的环境这三个维度相互作用,共同决定了开发者能否高效且愉悦地完成工作。开发者体验不是一个目的地,而是一段持续的旅程。

2401_88760782的博客 1429

Android自定义View实现不同朝向字体变色

实现效果:1.一个文字两种颜色2.实现不同朝向3.结合ViewPager思路:TextView可行?系统提供的只能够显示一种颜色,需要自定义Viewextends TextView:onMeasure()不需要实现 textColor颜色,textSize字体大小会少很多逻辑。1.一个文字两种颜色 画2.能够从左到右,从右到左3.整合到ViewPager,监听滚动事件自定义属性,不变化的颜色 originColor 变化的颜色 changeColorx要在这个位置。

ChenYiRan123456的博客 655

土壤数据库辅助工具SPAW计算土壤导水率

首先点击打开根据之前的1比100土壤数据查表得到各个组分含量其中Field Capacity是田间持水量Matric Bulk Density是基质粒密度。

所有专家都曾始于新手 3443

基于YOLOv10的机器人抓取引导系统:从物体检测到精准抓取

python# 数据标注工具简化版import os"""启动标注工具""""""标注单张图像"""print(f"标注图像: {os.path.basename(img_path)}")print("请在图像上绘制抓取矩形框...")# 这里应该实现交互式标注界面# 简化版本直接返回示例标注# 示例标注数据"""保存标注结果"""# 保存为YOLO格式# 转换为YOLO格式。

YOLO 378

自定义View的绘制原理图解

Measure过程决定了View的宽高,Measure完成以后,可以通过getMeasuredWidth和getMeasuredHeight方法来获取到View测量后的宽高,在几乎所有的情况下它都等于View的最终宽高,这仅仅是在代码规范的前提之下。 由上述流程来看Measure流程很简单,关键点是在于widthMeasureSpec, heightMeasureSpec这两个参数信息怎么获得?

Checkiming的博客 1128

《八》:玩家位置同步(玩家防碰撞)

在VR大空间体验中,由于玩家佩戴头显设备无法直接观察彼此位置,容易发生碰撞。因此,需要将玩家的实时位置信息绘制在虚拟空间中,实现位置可视化。通过获取头显的位置和旋转角度等数据,可以推算出玩家的移动状态和位置。使用可序列化的玩家结构体,通过UDP将玩家数据发送到服务器,服务器接收并反序列化数据后,同步所有玩家的最新信息至各客户端。客户端根据接收到的数据渲染虚拟人物模型,实现动态位置更新。这一过程涉及数据序列化、反序列化、网络通信和实时渲染等技术,确保玩家在虚拟空间中的位置同步和可视化。

unitygroup的博客 413

自定义View的布局

Android自定义View的方法

kayyoo的博客 482

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

自定义View知识体系

自定义View简介在Android原生控件无法满足需求的情况下,但是又需要实现一些特殊效果的时候该怎么办呢?这个时候就可以通过自定义View去实现。因此自定义View是对于Android工程师来说无疑是比较重要的技能。今天我会针对自定义View的一些知识作讲解,水平有限,不对的地方望批评交流。自定义View分类自定义View本质上其实就是通过Java的继承特性去扩展特定需求,且大家都知道Androi

李锦锋 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android自定义View全解

Android自定义View全解 目录 目录.png 1. 自定义View基础 1.1 分类 自定义View的实现方式有以下几种 类型 定义 自定义组合控件 多个控件组合成为一个新的控件,方便多处复用 继承系统View控件 继承自TextView等系统控件,在系统控件的基础功能上进行扩展 继承View 不复用系统控件逻辑,继承View进行功能定义...

yangaiyu的博客 302

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android如何提高自定义View,android是如何自定义view

如今需求的多种多样,app要求各种绚丽的效果,使得andriod开发的我们无法避免一个问题,最终逼得我们不得不去自定义一些view来实现需求。阅读了下 Android 我眼中的自定义View(2) 这篇文章,给自己做一个笔记。总结了下:通常自定义view有一下几种:1、直接继承View,或者ViewGroup去重写一个自定义view。2、继承某个已有的控件,比如TextView去重写一个自定义vi...

weixin_42508290的博客 204

自定义View学习总结

自定义View学习总结 自定义View一般有三种方式 继承View自定实现所有的逻辑 继承现有的View或者ViewGroup,在这些基础上加一些逻辑 组合现有的控件,添加一些额外的逻辑 这里我们就只看第一种,也是比较基础的。自定义View一般重写三个方法onMeasure,onLayout和onDraw onMeasure:测量View来确定最终的宽高 onLayout:布局确定子View的位置,自定义ViewGroup才需要重写这个方法 onDraw:可以在画布上画任何你想画的东西 首先定义一个

caobin_study的博客 599

Android自定义view面试

1.view绘制流程:measure,layout,draw measure:onMeasure,measureChild,measureChildren,setMeasureDimesion 先测量子view的大小,最后测量自身的大小 layout:onLayout,setFrame 先确定自身的位置,然后调用child.layout()确定子类位置 getLeft,getRight都是相对父控件的位置,相对原点的位置是getRawX MeasureSpec:32位,父类传递过来的值和自己的LayoutP

筱筱_之家的博客 1411

自定义View时,如何使用onSaveInstanceState与onRestoreInstanceState

当我们直接继承View进行自定义时,可以通过重写两个方法,并保存与恢复对应数据。

Ung8023 1140

实现添加view 同时伴随移除view动画的效果的自定义ViewGroup

整体代码 /** * @author * @desc : 支持添加view 伴随动画的效果 * */ class AnimViewGroup(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { /** * 缓存一个view 为了复用 */ var cacheScrapView: View? = null private set private v

搬砖爱好者 786

Android自定义View简述

文章目录onMeasureonDraw自定义ViewGroup组合型自定义View onMeasure 通过xml的layout_width/height指定自定义View的大小时,可以通过onMeasure指定View对于固定值、wrap_content、match_parent三种模式下的对应策略。 protected void onMeasure(int widthMeasureSpec, ...

用于记录、查询和分享 337

自定义的view中控件的点击事件实现

大多数时候我们需要自定义view实现功能,让代码更简洁化,但是在自定义view中控件,我们需要其实现点击事件,那么该怎么做呢?*1:自定义一个view,(本案例只实现一个button按钮的点击事件)*//自定义的view继承linearlayout public class Views extends LinearLayout{ Click click; Button button;

Miao_Hen的博客 1326

自定义view,viewgroup的onMeasure 方法

自定义view用了好久,用着用着吧感觉也就那么回事儿啊,如果想画个view,那就得知道view的大小。那么首当其中的就是onMeasure()方法啦。 先上一张图,这是我当年自学android的时候看的黑马视频的图。珍藏了快两年啦这张图,第一次看基本看不懂onMeasure有三种 模式 EXACTLY:精确 父容器已经知道 这个view的大小 AT_MOST:父容器 定了一个最大值,view不

svenWang_的专栏 4323

自定义View实现横,纵,斜向视图

public fhyxk(Context context) { this(context,null); } public fhyxk(Context context, AttributeSet attrs) { this(context, attrs,0); } public fhyxk(Context context, Attr...

qq_43578439的博客 198

Android酱油笔记之自定义View的宽高

import …… public class GameView extends View{ …… //自定义view的宽高 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = game.getScreenWidth()-game.getScree

缓行者 6260
上一篇: Jetpack - LiveData
下一篇: Jetpack - RecyclerView
Jomurphys
博客等级 码龄9年 1768粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值