自定义view中常用到哪些方法作用分别是什么

2024-09-08 08:20

本文主要是介绍自定义view中常用到哪些方法作用分别是什么,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 构造函数
  • onMeasure(int widthMeasureSpec, int heightMeasureSpec)
  • onDraw(Canvas canvas)
  • onLayout(boolean changed, int left, int top, int right, int bottom)
  • onTouchEvent(MotionEvent event)
  • onSizeChanged(int w, int h, int oldw, int oldh)
  • onAttachedToWindow() 和 onDetachedFromWindow()
  • onSaveInstanceState() 和 onRestoreInstanceState(Parcelable state)

在 Android 开发中,自定义 View 是一种常用的技术,允许开发者创建具有独特外观和行为的 UI 组件。自定义 View 通常涉及重写一些关键的方法,以实现特定的绘制和交互逻辑。

构造函数

作用
构造函数用于初始化 View。通常会有三个重载的构造函数,用于不同的初始化场景。

public class CustomView extends View {public CustomView(Context context) {super(context);init(context, null);}public CustomView(Context context, AttributeSet attrs) {super(context, attrs);init(context, attrs);}public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context, attrs);}private void init(Context context, AttributeSet attrs) {// 初始化代码}
}

onMeasure(int widthMeasureSpec, int heightMeasureSpec)

作用
该方法用于测量 View 的大小。开发者需要在这个方法中计算 View 的宽度和高度,并调用 setMeasuredDimension(int measuredWidth, int measuredHeight) 来设置测量结果。

Android之onMeasure的三种模式

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthMode = MeasureSpec.getMode(widthMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int width = 0;int height = 0;// 根据测量模式和给定的尺寸来计算 View 的宽高if (widthMode == MeasureSpec.EXACTLY) {width = widthSize;} else if (widthMode == MeasureSpec.AT_MOST) {width = Math.min(200, widthSize); // 假设最大宽度为 200}if (heightMode == MeasureSpec.EXACTLY) {height = heightSize;} else if (heightMode == MeasureSpec.AT_MOST) {height = Math.min(200, heightSize); // 假设最大高度为 200}setMeasuredDimension(width, height);
}

onDraw(Canvas canvas)

作用
该方法用于绘制 View 的内容。开发者需要在这个方法中使用 Canvas 对象来绘制图形、文本或其他内容。

@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setColor(Color.RED);paint.setStyle(Paint.Style.FILL);// 绘制一个红色的圆canvas.drawCircle(getWidth() / 2, getHeight() / 2, Math.min(getWidth(), getHeight()) / 2, paint);
}

onLayout(boolean changed, int left, int top, int right, int bottom)

作用
该方法用于布局 View 的子视图。自定义 ViewGroup 通常需要重写这个方法,以确定每个子视图的位置和大小。

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {int childCount = getChildCount();int currentTop = top;for (int i = 0; i < childCount; i++) {View child = getChildAt(i);int childHeight = child.getMeasuredHeight();child.layout(left, currentTop, right, currentTop + childHeight);currentTop += childHeight;}
}

onTouchEvent(MotionEvent event)

作用
该方法用于处理触摸事件。开发者可以在这个方法中实现自定义的触摸交互逻辑。

@Override
public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 处理按下事件return true;case MotionEvent.ACTION_MOVE:// 处理移动事件return true;case MotionEvent.ACTION_UP:// 处理抬起事件return true;}return super.onTouchEvent(event);
}

onSizeChanged(int w, int h, int oldw, int oldh)

作用
该方法在 View 的大小发生变化时调用。开发者可以在这个方法中处理与尺寸变化相关的逻辑。

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);// 处理尺寸变化的逻辑
}

onAttachedToWindow() 和 onDetachedFromWindow()

作用
onAttachedToWindow() 在 View 被附加到窗口时调用,可以在这里进行一些资源的初始化。
onDetachedFromWindow() 在 View 从窗口分离时调用,可以在这里进行一些资源的释放

@Override
protected void onAttachedToWindow() {super.onAttachedToWindow();// 资源初始化
}@Override
protected void onDetachedFromWindow() {super.onDetachedFromWindow();// 资源释放
}

onSaveInstanceState() 和 onRestoreInstanceState(Parcelable state)

作用
用于保存和恢复 View 的状态,通常在需要处理配置变化(如屏幕旋转)时使用。

@Override
protected Parcelable onSaveInstanceState() {Parcelable superState = super.onSaveInstanceState();// 保存自定义状态return superState;
}@Override
protected void onRestoreInstanceState(Parcelable state) {super.onRestoreInstanceState(state);// 恢复自定义状态
}

这篇关于自定义view中常用到哪些方法作用分别是什么的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147601

相关文章

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave