Android自定义控件(2)--自定义ViewGroup/组合控件

Android图形系统(四)应用篇:自定义View/ViewGroup详解 查看 measure()和 heightMeasureSpec就是帮助子 View 确定大小的参数它们的类型是int,内部以高两位来存储测量的模式,低三十位为测量的大小,计算中使用了位运算来提高并优化效率当然,我们不必使用位运算来获得对应的数值,MeasureSpec 类为我们提供了对应的方法//未指定,不限制大小//精确模式//最大模式:未指定模式,也可以称为无限制模式。当你收到此模式时,表明父视图不关心你的尺寸大小,你可以随意设置自己的尺寸信息。什么情况下可能收到呢? 阅读详情

自定义ViewGroup/组合控件

一、重复布局的使用

在开发中,经常遇到在App中多个地方使用相同的布局的场景,如自己的actionbar或者加载动画等。实现的方法有:

  1. 最直观的,在每个地方用xml写出各自的布局;

  2. 使用include标签实现layout文件复用
    首先创建一个layout的xml文件,在其中编写需要重复使用的布局;在用到的地方使用< include>标签来实现复用。

    < include layout="@layout/layout_file" />

  3. 通过自定义ViewGroup实现
    是最常用的方案,易于维护且实现难度不大,对于提高代码复用、降低布局文件与activity耦合都有着重要的作用。

二、自定义ViewGroup实现

下面以一个实际需求为例:在桌面应用中通过自定义ViewGroup实现一个Dock栏。

2.1 编写布局文件

新建一个layout文件,编写自定义viewgroup包含的内容以及样式,一般使用RelativeLayout或LinearLayout中包含系统控件的方式实现;
若要在自定义ViewGroup中动态加载,也可以不需要布局文件,通过继承RelativeLayout或LinearLayout,使用addView()方法动态添加子view,并使用LayoutParam设置子view的布局参数,如大小、左右缩进等;

如下向线性布局中动态添加一个ImageView:

LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(iconSize,iconSize);
params1.leftMargin = pads;
params1.rightMargin=pads;
params1.topMargin=(iconPadTop);
params1.bottomMargin=(iconPadTop);

ImageView iv=new ImageView(ctx);
iv.setImageDrawable(apps.get(i).getAppIcon());
iv.setOnClickListener(this);
this.addView(iv,i,params1);           V.iewGroup类继承LinearLayout
2.2 添加自定义属性.

与上一篇添加自定义属性方法相同,在attrs.xml中声明一个< declare-stylable>并添加属性;以下为Dock栏设置了背景色、图标大小,及与上下的距离。

< declare-styleable name="Dock">
    < attr name="iconPaddingTop" format="dimension"/>
    < attr name="dockBacgroundColor" format="color"/>
    <attr name="dockIconSize" format="dimension"/>
</declare-styleable>
2.3 创建ViewGroup类并继承合适的布局

考虑到Dock栏的需求,需要将添加的应用图标横向的排列,故继承LinearLayout实现,并在构造方法中设置方向为横行;

2.4 编写ViewGroup方法

实现类中的各种方法;

2.4.1 构造方法
public class Dock extends LinearLayout implements View.OnClickListener,View.OnTouchListener {

public Dock(Context context) {
    this(context,null);
}

public Dock(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs,0);
}

public Dock(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    ctx=context;
    
    setOrientation(LinearLayout.HORIZONTAL);
}
2.4.2 获取自定义属性

与自定义View相同,使用TypedArray获取自定义属性;下面的代码中计算了图标显示的像素大小,并通过pad值计算Dock的高度;

private void initAttrs(Context context, AttributeSet attrs){
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();  //getSystemService(Context.WINDOW_SERVICE).getDefaultDisplay().getMetrics(displayMetrics);
    density =displayMetrics.density;
    dockWidth=displayMetrics.widthPixels;

    TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.Dock);
    iconSize=(int)ta.getDimension(R.styleable.Dock_dockIconSize,dp2px(context,60));   
    iconPadTop=(int)ta.getDimension(R.styleable.Dock_iconPaddingTop,dp2px(context,15));     

    dockHeight=iconSize; //(int)ta.getDimension(R.styleable.Dock_dockHeight,dp2px(context,100));
    dockBgColor=ta.getColor(R.styleable.Dock_dockBacgroundColor, Color.parseColor("#f8f8f8"));
    
    ta.recycle();
}
2.4.3 初始化View

设置Dock栏背景,并添加图标;

private void initView(Context context){
    setBackgroundColor(dockBgColor);

	for(int i=0;i<apps.size();i++)
    {
        LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(iconSize,iconSize);       //View大小
        params1.leftMargin = pads;        //设置图标添加位置
        params1.rightMargin=pads;
        params1.topMargin=(iconPadTop);
        params1.bottomMargin=(iconPadTop);

        ImageView iv=new ImageView(ctx);
        iv.setImageDrawable(apps.get(i).getAppIcon());
        
        this.addView(iv,i,params1);
    }
}
2.4.4 其他业务需求方法

点击图标打开应用等操作;

2.5 在布局中引用该控件

通过实现上面的方法,完成了一个自定义ViewGroup的桌面Dock栏自定义Dock栏开发;
实现以后,就可以在主activity中引用此控件并设置属性,如下:

<com.space.lisktop.Dock
    android:id="@+id/mydock"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:iconPaddingTop="8dp"
    app:dockIconSize="60dp"
    app:dockBacgroundColor="#eeeeee"/>
安卓面试题之---自定义View ##一,自定义View的分类 -1.继承View或者ViewGroup类,重写onDraw方法,调用invalidate方法重新绘制View(譬如说计数器) - -2.自定义组合控件,即将几种控件组合起来形成一个新的控件,这个新的组合控件就会整合了原来每一个控件的功能(譬如说新浪微博中ListView第一行上面的状态栏),(继承组合控件布局的跟布局) - -3.自定义扩展控件,也就... 阅读详情

相关推荐

图像识别火灾检测系统实战:从火焰特征到YOLO部署全解析

计算机视觉技术正深入改变传统消防的感知方式。图像识别火灾检测利用摄像头采集的视频流,通过颜色、动态和形态特征分析,实现早期火情的自动发现与定位。其核心原理在于,火焰在视觉上具有独特的颜色分布、闪烁特性和轮廓变化,借助目标检测模型如YOLO,可在复杂场景中区分真实火焰与干扰物。这项技术广泛应用于仓库、园区、隧道等大空间场所,是智慧消防的重要支撑。本文从火焰视觉特征、数据集构建、模型选型与系统架构设计出发,结合部署实践中的误报与算力优化经验,为开发者提供一套可落地的视频火焰检测方案。

weixin_42533751的博客 245

View篇:玩一下自定义ViewGroup

自定义ViewGroup可不像自定义View那么简单 今日聚焦: 1.自定义ViewGroup中花样布局子View 2.移动View用layout、translation、TranslationAnimation、ViewPropertyAnimator、scrollTo、scrollBy有什么区别? 3.ViewGroup里怎么给孩子加动画 4.惯性移动? 也许你可以了解一下 复制代码 ...

weixin_34409703的博客 235

如何在iPhone上本地运行SmolVLM?5亿参数模型实战指南(附Swift代码)

本文详细介绍了如何在iPhone上本地部署和运行轻量高效的SmolVLM多模态模型。通过实战指南,分享了使用Swift和MLX框架进行环境配置、模型加载、内存优化以及实现实时图像分析与文本生成的完整流程,帮助开发者在移动端高效运行AI视觉语言模型。

echo99的专栏 657

Android面试题-手把手教你如何解决as jar包冲突

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

2401_84538135的博客 837

source tree clone error:fatal remote error: Repository not found

source tree clone error:fatal remote error: Repository not found

Linda的前端开发路 3077

基于IMU的纯惯性导航轨迹绘制实践与优化

本文深入探讨了基于IMU的纯惯性导航轨迹绘制实践。通过修改开源组合导航算法KF-GINS,屏蔽GPS更新并简化地球参数,实现了仅依赖IMU数据的轨迹解算。文章详细介绍了代码改造、轨迹可视化方法,并分析了误差累积的根本原因,为深入理解惯性导航原理与传感器融合的必要性提供了宝贵的实践经验。

ff678的博客 398

android 自定义View(三) 自定义ViewGroup之可添加的view

在这章我,我们将通过自定义的一个ViewGroup来实现一个类似于今日头条中编辑分类添加的效果。   首先,需要先继承一个ViewGroup。 public class MyViewGroup extends ViewGroup{ public MyViewGroup(Context context,AttributeSet attrs) { super(cont

hukuhy的博客 939

Windows 10/11 注册表 ProfileImagePath 误改修复:3步恢复用户登录与数据安全

本文详细介绍了Windows 10/11系统中因误改注册表ProfileImagePath键值导致用户无法登录的修复方法。通过3个关键步骤,包括定位SID、安全修复注册表项及验证处理,帮助用户恢复登录并保障数据安全。特别强调了操作顺序的重要性以避免数据丢失,适用于各类Windows用户账户登录错误的紧急处理。

chuoshao2508的博客 403

Android中自定义ViewGroup

网上高级工程师面试相关文章鱼龙混杂,要么一堆内容,要么内容质量太浅, 鉴于此我整理了上述安卓开发高级工程师面试题以及答案。希望帮助大家顺利进阶为高级工程师。目前我就职于某大厂安卓高级工程师职位,在当下大环境下也想为安卓工程师出一份力,通过我的技术经验整理了面试经常问的题,答案部分是一篇文章或者几篇文章,都是我认真看过并且觉得不错才整理出来。大家知道高级工程师不会像刚入门那样被问的问题一句话两句话就能表述清楚,所以我通过过滤好文章来帮助大家理解。现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕。

2401_84009749的博客 619

以宠辱之戒写 SAP Fiori Elements,把标准能力当成身体,把扩展冲动当成大患

SAP Fiori Elements开发中常面临业务方追求"独特页面"的压力,但过度自定义会破坏框架价值。老子"宠辱若惊"的智慧提醒开发者:不应因用户称赞或批评而动摇架构原则。标准模板的价值在于确保业务语义、交互规范和后端服务的一致性。扩展应遵循官方API,将业务逻辑放在ABAP/CDS层而非前端控制器。成熟项目会平衡标准与定制,使用annotation表达UI行为,仅在必要时通过受支持的extension points进行增强,保持系统的长期可维护性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1000

200、从反激到LLC:工程师的成长之路

文章摘要: 本文以工程师视角探讨从反激式到LLC电源设计的思维转变。通过48V通信电源故障案例,揭示LLC谐振电容ESR温度特性引发的隐患,强调LLC需精确计算与测试。对比反激与LLC的核心差异:反激需控制寄生参数(如漏感尖峰、电容ESR),而LLC的关键在于频率响应和死区时间优化。作者提出三大思维转变:从匝比计算转向增益曲线分析,从时域波形观察转向频域频谱诊断,从元件更换转向参数调整。最后给出实战建议,包括建立故障库、关注元件参数细节及示波器调试技巧,指出工程师需从"控制"思维升级为"谐振"思维,实现技术

Jack010169的博客 323

Android自定义控件之自定义组合控件

使用自定义组合控件的好处? 提高布局文件开发效率 降低布局文件维护成本 降低布局文件和Activity代码耦合性 容易扩展 简单易用 如何实现一个自定义组合控件 1.)先定义一个布局文件 <merge xmlns:android="http://schemas.android.com/apk/res/android"> <Button a...

这个男孩不简单的博客 1097

智能体开发套件(ADK)介绍

city } ---") city_normalized = city . lower() . replace(" " , "") # 模拟天气数据库 mock_weather_db = {

lpfasd123的博客 1409

Android 自定义控件笔记(如何创建自己的自定义控件,具体步骤)

自定义View,自定义控件

Chenyile161616的博客 2202

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android自定义view(二),组合控件Titlebar的定制

前言:我相信”天生我才必有用”这句话,每个人都有他的作用,也许他的作用相对其他人来不是很明显,也许他的作用也就是取悦别人,但是请不要忘记,可以通过不断努力来发挥自己的作用,使自己的价值得到提升。在平时的android开发中你是否遇到一个问题,那就是每次都要自己写一个布局,或者是引入一个布局但每次都要为了给布局中的控件初始化。对于这个问题,谷歌官方推出了ActionBar,以及随后的取代ActionB

宿罪的博客 6330

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

自定义控件-组合控件

自定义控件当原生控件不能满足需要时,需要进行自定义控件,自定义控件可分为三种方式: 对现有控件进行拓展 通过现有控件的组合实现新的控件 完全自定义一个新的控件 组合控件的使用方式1、新建控件类首先控件是一个Java类,如android.widget.TextView类、android.widget.LinearLayout类等,那么自定义控件时,也必须新建一个自定义控件的类。由于该自定义控件由多个现

一路洒满阳光! 1678

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android Studio自定义组合控件

在Android的开发中,为了能够服用代码,会把有一定共有特点的控件组合在一起定义成一个自定义组合控件。 本文就详细讲述这一过程。虽然这样的View的组合有一个粒度的问题。粒度太大了无法复用,粒度太小了又 达不到很好的复用的效果。不过,这些不在本文的讨论范围,需要读者自己去开发的实践中体会。 实例项目就选择一个登录注册的组件,这组件包括用户名、密码的文本输入框,还有登录和注册的按钮。这里 主...

weixin_33827965的博客 1097

Android自定义View的四种方式

一 前言 在Android开发中有很多业务场景,原生的控件是无法满足应用,并且经常也会遇到一个UI在多处重复使用情况,那么就需要通过自定义View的方式来实现这些UI效果。作为一个Android开发工程师自定义View属于一个必备技能。 像前几天正好做了一个上传本地图片的网格UI,点击相机的icon就可以上传选择本地图片,选中图片之后就可以显示的界面上。本来可以使用Android原生GridView,但是这个控件由于嵌套到ScrollView中,所以导致滑动事件冲突,当然网上...

nihaomabmt的专栏 9970

Android 自定义控件之组合控件

一、前言        最近做一个项目又一次用到类似像微信一样的标题栏,之前就实现过一次,但是几个月没有用了,就忘记了,导致这次再次使用却调了大半天才完成。因此,写下这篇文章记录下来,同时再一次巩固自己的理解。        这回使用的Android的自定义控件中的组合控件。二、自定义组合控件原理        项目中经常会遇见很多相似或者相同的布局,比如APP的标题栏,通过将这些布局抽取出来,放...

gd6321374的专栏 1万+

android自定义控件(组合控件)相关

自定义组件及根据需求定义符合要求的控件 自定义控件流程: 一、继承相应View,如:TextView  ImageView; 组合控件一般继承ViewGroup,如:LinearLayout etc. 二、构造方法: public ArrowIndicatorView(Context context){this(context, null);} //该构造方法在代码中new该控件时调用

sinat_22910799的博客 275

android加载组合控件,Android自定义控件之组合控件

在开发中,有时候我们会遇到很多控件用在一起,并且它们都用在很多地方,如果这个只是一些很少的控件的组合,还是可以的,不会有太大的影响,如果过多的控件组合在一起,那就会出现布局很累赘,代码更是累赘,所以我们要想一个办法来解决这个问题,让我们的项目代码看起来很舒服。解决这种问题的方法很多,比如只在布局中用include标签来将我们需要的组合控件一起加载进来,但是这种虽然解决了布局的问题,但是在代码中并没...

weixin_34965737的博客 255

Android 自定义View与ViewGroup

自定义View与ViewGroup 一、概述: (一)、View和ViewGroup的职责 1、ViewGroup的职责是什么? ViewGroup相当于一个放置View的容器,在写布局xml的时候,会告诉容器(凡是以layout开头的属性,都是为用于告诉容器),容器宽度(layout_width)、高度(layout_height)、对齐方式(layout_gravity),还有margin等。因此ViewGroup的职能为:给childView计算出建议的宽和高和测量模式 ,决定childView的位置

yanhuomatou2015的博客 436

Android中自定义组合控件

转自http://www.cnblogs.com/ivan-xu/p/4545929.html Android中自定义控件的情况非常多,一般自定义控件可以分为两种:继承控件及组合控件。前者是通过继承View或其子类,重写方法实现自定义的显示及事件处理方式;后者是通过组合已有的控件,来实现结构的简化和代码的重用。 本篇文章主要介绍自定义组合控件,继承控件后续有机会再述。 自定义组合控件一般

seashine_yan的博客 316

android 原理 组合控件_Android组合控件实现功能强大的自定义控件

通常情况下,Android实现自定义控件无非三种方式。Ⅰ、继承现有控件,对其控件的功能进行拓展。Ⅱ、将现有控件进行组合,实现功能更加强大控件。Ⅲ、重写View实现全新的控件上文说过了如何继承现有控件来自定义控件:《Android继承现有控件拓展实现自定义控件textView》,这节我们来讨论第二个议题。怎么将控件组合来实现一个功能强大的自定义控件。先看看创建组合控件的好处吧,创建组合控件能够很好的...

weixin_39807691的博客 197

自定义组合控件

这里先不具体介绍如何实现一个自定义组合控件,这里先介绍一下自定义组合控件带来的好处。 提高布局文件开发效率降低布局文件维护成本降低布局文件和Activity代码耦合性容易扩展简单易用  如何实现一个自定义组合控件 1.)先定义一个布局文件 merge xmlns:android="http://schemas.android.com/apk/res/android">

Eligah825的博客 393
上一篇: Android自定义控件(1)--自定义View
下一篇: Android自定义控件(3)--继承系统View
HanZhizhi
博客等级 码龄11年 297粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值