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

【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View

Android Java 自定义View

步骤

创建一个新的Java类,继承自ViewViewGroup或其他任何一个视图类。

如果需要,重写构造函数以支持不同的初始化方式。

重写onMeasure方法以提供正确的测量逻辑。

重写onDraw方法以实现绘制逻辑。

根据需要重写其他方法,如onSizeChangedonTouchEvent等。

自定义 View 

public class CustomView extends View {private Paint paint;public CustomView(Context context) {super(context);init();}public CustomView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}private void init() {paint = new Paint();paint.setColor(Color.BLUE);paint.setStyle(Paint.Style.FILL);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int defaultSize = 200;setMeasuredDimension(getDefaultSize(defaultSize, widthMeasureSpec),getDefaultSize(defaultSize, heightMeasureSpec));}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 绘制一个简单的蓝色圆形canvas.drawCircle(getWidth() / 2, getHeight() / 2, 100, paint);}
}
<com.example.yourapplication.CustomViewandroid:layout_width="wrap_content"android:layout_height="wrap_content" />

Android Java 自定义View

步骤

创建一个新的Kotlin类,继承自View或其子类(如TextViewLinearLayout等)。

重写构造函数,至少提供一个能够接受ContextAttributeSet的构造函数。

如果需要,重写其他构造函数。

重写onMeasure方法以提供正确的测量逻辑。

重写onDraw方法以提供绘制逻辑。

根据需要重写其他方法,如onSizeChangedonTouchEvent等。

自定义View 

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.Viewclass CustomView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {private val paint = Paint().apply {color = Color.REDstrokeWidth = 5f}override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {// 设置默认的大小val defaultSize = 200setMeasuredDimension(resolveSize(defaultSize, widthMeasureSpec),resolveSize(defaultSize, heightMeasureSpec))}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)// 绘制一个简单的矩形canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)}
}

ios Object-c 自定义 View

在Objective-C中创建自定义视图通常涉及到继承自UIView类并实现自定义的初始化方法、绘图方法和其他需要的方法。以下是一个简单的自定义视图的例子:

 自定义View

// MyCustomView.h
#import <UIKit/UIKit.h>@interface MyCustomView : UIView@end// MyCustomView.m
#import "MyCustomView.h"@implementation MyCustomView// 初始化方法,可以自定义或使用默认的初始化方法
- (instancetype)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self) {// 自定义初始化代码}return self;
}// 当视图需要重绘时调用
- (void)drawRect:(CGRect)rect {// 获取图形上下文CGContextRef context = UIGraphicsGetCurrentContext();// 在这里绘制图形或图像// 例如,绘制一个简单的红色矩形CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);CGContextFillRect(context, rect);
}@end
// 在你的视图控制器中
#import "MyCustomView.h"// ...MyCustomView *customView = [[MyCustomView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[self.view addSubview:customView];

IOS Swift 自定义 View

在Swift中创建自定义视图通常涉及到定义一个继承自UIView的新类,并且通常需要重写init(frame:)layoutSubviews()方法。以下是一个简单的自定义视图的例子:

import UIKitclass CustomView: UIView {// 自定义视图的初始化override init(frame: CGRect) {super.init(frame: frame)setupView()}// 使用Storyboard或者XIB时需要的初始化方法required init?(coder aDecoder: NSCoder) {super.init(coder: aDecoder)setupView()}// 视图布局发生变化时调用override func layoutSubviews() {super.layoutSubviews()// 在这里可以根据视图的新布局进行调整}// 设置视图的共有属性private func setupView() {backgroundColor = .blue // 设置背景颜色为蓝色// 其他自定义设置...}// 可以添加更多自定义的方法和属性
}
class ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()let customView = CustomView()customView.frame = CGRect(x: 50, y: 100, width: 200, height: 200)view.addSubview(customView)}
}

HarmonyOS Next 自定义View

@Component 表示这是一个自定义组件

@Entry 表示该自定义组件为入口组件

@State 表示组件中的状态变量,状态变量变化会触发UI刷新

UI部分 :以声明式的方式来描述UI的结构

@Component
export struct HelloPage {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message).fontSize(40).fontWeight(FontWeight.Bold).onClick(() => {this.message = "Hello Harmonyos"})}.width('100%')}.height('100%')}
}

React Native 自定义组件

描述

定义组件结构: 使用 JSX 定义组件的 UI 结构。
定义组件样式: 使用 StyleSheet 或内联样式定义组件的样式。
处理组件逻辑: 使用 React Hooks(如 useState, useEffect)管理组件状态和副作用。
定义组件接口: 通过 props 传递数据和事件处理器,实现组件的可配置性。

自定义组件 

// components/MyButton.js
import React from 'react';
import { TouchableOpacity, Text, StyleSheet } from 'react-native';const MyButton = ({ title, onPress, style, textStyle }) => {return (<TouchableOpacity style={[styles.button, style]} onPress={onPress}><Text style={[styles.text, textStyle]}>{title}</Text></TouchableOpacity>);
};const styles = StyleSheet.create({button: {backgroundColor: '#007bff',padding: 10,borderRadius: 5,alignItems: 'center',},text: {color: '#fff',fontSize: 16,},
});export default MyButton;
// screens/HomeScreen.js
import React from 'react';
import { View, StyleSheet } from 'react-native';
import MyButton from '../components/MyButton';const HomeScreen = () => {const handlePress = () => {alert('Button Pressed!');};return (<View style={styles.container}><MyButton title="Press Me" onPress={handlePress} /><MyButton title="Custom Style" onPress={handlePress} style={{ backgroundColor: '#28a745' }} textStyle={{ fontSize: 18 }} /></View>);
};const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',padding: 20,},
});export default HomeScreen;

Flutter 自定义Widget

描述

创建一个新的Dart文件。

导入必要的Flutter库。

定义一个继承自StatelessWidgetStatefulWidget的类。

重写build方法以返回一个Widget。

自定义Widget 

import 'package:flutter/material.dart';class CustomButton extends StatelessWidget {final String label;final VoidCallback onPressed;const CustomButton({Key? key, required this.label, required this.onPressed}) : super(key: key);@overrideWidget build(BuildContext context) {return ElevatedButton(onPressed: onPressed,child: Text(label),);}
}

CustomButton是一个继承自StatelessWidget的自定义Widget,它接受两个参数:labelonPressedbuild方法返回一个ElevatedButton,它是Flutter提供的一个按钮Widget,并使用构造函数中传入的参数。

void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(body: Center(child: CustomButton(label: 'Click Me',onPressed: () {// Handle button press},),),),);}
}

 

相关文章:

【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View

Android Java 自定义View 步骤 创建一个新的Java类&#xff0c;继承自View、ViewGroup或其他任何一个视图类。 如果需要&#xff0c;重写构造函数以支持不同的初始化方式。 重写onMeasure方法以提供正确的测量逻辑。 重写onDraw方法以实现绘制逻辑。 根据需要重写其他方法&…...

win11跳过联网激活步骤

win11跳过联网激活步骤 win11跳过联网激活步骤方法一&#xff1a;使用Shift F10快捷键&#xff08;推荐&#xff09;1. 启动Windows 112. 选择键盘布局或输入法3. 是否想要添加第二种键盘布局4. 让我们为你连接到网络5. 调出管理员模式CMD6. 耐心等待自动重启7. 启动Windows 1…...

利用c语言详细介绍下冒泡排序

软件开发过程中&#xff0c;排序算法是常规且使用众多的方法之一&#xff0c;而冒泡算法又是排序算法中最常规且基本的算法。今天我们利用c语言&#xff0c;图文详细介绍下冒泡算法。 一、图文介绍 我们输入一个数组&#xff0c;数组为【10&#xff0c;5&#xff0c;3&#xf…...

C# 面向对象

C# 面向对象编程 面向过程&#xff1a;一件事情分成多个步骤来完成。 把大象装进冰箱 (面向过程化设计思想)。走一步看一步。 1、打开冰箱门 2、把大象放进冰箱 3、关闭冰箱门 面向对象&#xff1a;以对象作为主体 把大象装进冰箱 1、抽取对象 大象 冰箱 门 &#xff0…...

android wifi扫描的capability

混合型加密android11 8155与普通linux设备扫描到的安全字段差别 android应用拿到关于wifi安全的字段&#xff1a; systembar-WifiBroadcastReceiver---- scanResult SSID: Redmi_697B, BSSID: a4:39:b3:70:8c:20, capabilities: [WPA-PSK-TKIPCCMP][WPA2-PSK-TKIPCCMP][RSN-PSK…...

datawhale 2411组队学习:模型压缩4 模型量化理论(数据类型、int8量化方法、PTQ和QWT)

文章目录 一、数据类型1.1 整型1.2 定点数1.3 浮点数1.3.1 正规浮点数&#xff08;fp32&#xff09;1.3.2 非正规浮点数&#xff08;fp32&#xff09;1.3.3 其它数据类型1.3.4 浮点数误差1.3.5 浮点数导致的模型训练问题 二、量化基本方法2.1 int8量化2.1.1 k-means 量化2.1.2 …...

数据分析-48-时间序列变点检测之在线实时数据的CPD

文章目录 1 时间序列结构1.1 变化点的定义1.2 结构变化的类型1.2.1 水平变化1.2.2 方差变化1.3 变点检测1.3.1 离线数据检测方法1.3.2 实时数据检测方法2 模拟数据2.1 模拟恒定方差数据2.2 模拟变化方差数据3 实时数据CPD3.1 SDAR学习算法3.2 Changefinder模块3.3 恒定方差CPD3…...

POD-Transformer多变量回归预测(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现POD-Transformer多变量回归预测&#xff0c;本征正交分解数据降维融合Transformer多变量回归预测&#xff0c;使用SVD进行POD分解&#xff08;本征正交分解&#xff09;&#xff1b; 2.运行环境Matlab20…...

Hadoop生态圈框架部署(七)- MySQL安装与配置教程

文章目录 前言一、MySQL安装与配置&#xff08;手动部署&#xff09;1. 下载MySQL2. 上传安装包3. 解压HBase安装包4. 配置4.1 配置 MySQL 的主配置文件 my.cnf4.2 配置 MySQL 服务的脚本 5. 初始化MySQL数据库6. 创建快捷方式7. 启动MySQL服务8. 修改MySQL登录密码8.1 使用临时…...

视频直播5G CPE解决方案:ZX7981PG/ZX7981PMWIFI6网络覆盖

方案背景 视频直播蓬勃发展的当下&#xff0c;传统直播网络联网方式的局限性越来越明显。目前传统直播的局限性主要集中在以下几个方面&#xff1a; 传统直播间网络架构条件有限&#xff0c;可连接WIFI数量少&#xff0c;多终端同时直播难以维持&#xff1b;目前4G网络带宽有限…...

技术周刊 |Google 2024 年首届 Web AI 峰会回顾

大家好&#xff0c;我是童欧巴。见字如面&#xff0c;万事胜意&#xff0c;欢迎来到第 134 期周刊。 大厨推荐 Google 2024 年首届 Web AI 峰会回顾 不仅包括来自谷歌团队的演讲者&#xff0c;如 Chrome 和 MediaPipe&#xff0c;还包括第三方代表&#xff0c;如英特尔、Hug…...

web——upload-labs——第十二关——%00截断

查看源码 分析源码我们可以知道&#xff0c;这里是基于白名单过滤&#xff0c;只允许上传jpg,png,gif&#xff0c;但是这里注意第八行&#xff0c;上传路径是可以控制的&#xff0c;所以可以利用%00截断&#xff0c;来达到上传木马的目的。这里要注意一下&#xff0c;%00截断想…...

ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值。ojdbc8版本23.2.0.0驱动BUG【已解决】

问题描述 JDK8使用ojdbc8驱动操作oracle11g数据库&#xff0c;使用JDBC复用 PreparedStatement 对象执行Insert操作时&#xff0c;报错java.sql.SQLException: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值。&#xff0c;经测试发现&#xff0c;是预编译对象某个占位符号被赋…...

win10 自带 directx 修复工具怎么用?最新 directx 修复工具使用方法介绍

DirectX 是一组用于处理多媒体&#xff0c;特别是游戏和图形相关任务的技术和接口。当 DirectX 出现问题&#xff0c;可能会导致游戏运行不畅、图像显示异常、声音故障等。 系统自带的 directx 修复工具能够检测 DirectX 的组件是否完整、版本是否正确、配置是否合理&#xff…...

报错java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not ...解决方法

在运行项目时出现java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualidzz这样的报错 解决方法 1.第一步&#xff1a;在pom文件中将lombok的版本改成最新的 此时1.18.34是新…...

前端三大件之CSS

引言 CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种用于描述网页文档外观和格式的样式表语言。它主要用于控制网页的布局、颜色、字体、间距等视觉效果&#xff0c;使开发者能够将内容与设计分离。 一&#xff0c;CSS的基本概念 选择器&…...

C语言 | 指针 | 野指针 | 数组指针 | 指针数组 | 二级指针 | 函数指针 | 指针函数

文章目录 1.指针的定义2.指针的加减运算3.野指针4.指针 & 数组 & 传参 & 字符数组5.数组指针 & 指针数组6.二级指针7.指针函数 & 函数指针 & 回调函数8.函数指针数组 & 指向函数指针数组的指针 1.指针的定义 指针是内存中一个最小单元的编号&…...

mysql 的乐观锁和 mvcc 是一回事吗

MySQL 的乐观锁和 MVCC&#xff08;多版本并发控制&#xff09;是两个不同的概念&#xff0c;尽管它们都涉及到并发控制和数据的一致性&#xff0c;但在设计目的和实现方式上存在本质区别。 1. 乐观锁 概念 乐观锁是一种用于解决并发更新冲突的控制机制。它假设数据在大部分情况…...

redis的击穿和雪崩

Redis 是一个高性能的键值存储数据库&#xff0c;广泛用于缓存、会话管理等场景。然而&#xff0c;Redis 在高并发场景下可能会遇到一些问题&#xff0c;比如“击穿”和“雪崩”。下面详细解释这两个概念&#xff1a; 击穿&#xff08;Hotspot&#xff09; 击穿是指某个热点数…...

java中创建多线程的4种方式

目录 一、继承 Thread 类创建线程 步骤 示例代码 原理 二、实现 Runnable 接口创建线程 步骤 示例代码 原理 三、实现 Callable 接口创建线程 步骤 示例代码 原理 与Runnable接口相比的不同之处 四、使用线程池创建线程 步骤 示例代码&#xff08;使用 Executo…...

如何用Zutilo插件提升Zotero文献管理效率:5个实用技巧帮你节省50%时间

如何用Zutilo插件提升Zotero文献管理效率&#xff1a;5个实用技巧帮你节省50%时间 【免费下载链接】Zutilo Zotero plugin providing some additional editing features 项目地址: https://gitcode.com/gh_mirrors/zu/Zutilo 你是否经常在Zotero中花费大量时间处理文献标…...

Visual C++ 运行库全家桶:一键解决Windows软件运行问题的终极方案

Visual C 运行库全家桶&#xff1a;一键解决Windows软件运行问题的终极方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为"应用程序无法启动"…...

负载均衡器类型与配置

硬件负载均衡器硬件负载均衡器通常由专用设备提供&#xff0c;例如F5 BIG-IP、Citrix ADC等。这些设备提供高性能和稳定性&#xff0c;适合大型企业和高流量场景。软件负载均衡器软件负载均衡器包括Nginx、LVS、HAProxy、Kong和SLB等。它们分为L7层和L4层负载均衡器。L7层负载均…...

行为准则主题钓鱼攻击机理与 AiTM 防御体系研究

摘要 2026 年 5 月&#xff0c;微软安全部门发布预警&#xff0c;披露一类以行为准则审查为伪装的大规模钓鱼攻击活动。该攻击依托高度仿真的企业合规通知邮件&#xff0c;诱导员工访问恶意登录页面&#xff0c;采用对手中间人&#xff08;AiTM&#xff09; 技术窃取账号凭据与…...

Obsidian 坚果云同步最佳实践:Nutstore Sync 大仓库提速、冲突策略、.obsidian配置同步与恢复方案

适用人群&#xff1a;Obsidian 重度用户&#xff08;上千/上万文件、图片/附件多、跨设备高频编辑、对稳定性与可恢复性要求高&#xff09;。 强烈建议&#xff1a;操作前先把整个 Vault 复制一份做离线备份。 1. 你要解决的不是“能不能同步”&#xff0c;而是“同步体系” 重…...

应对海外AIGC检测:初稿AI率飙到97%怎么救?4个结构级优化实测指南

大家最近都在为英文降aigc率发愁吧&#xff0c;作为研三党&#xff0c;我太懂这种痛了&#xff0c;之前我自己写英文初稿&#xff0c;写完直接拿去查重&#xff0c;结果turnitin检测ai率飙到了89%&#xff0c;当时看着报告整个人都懵了。 怎么给英文降ai&#xff1f;对于非母语…...

把“贪吃蛇”做成塔防Boss,这个Unity模板是怎么设计的?附完整变现思路

在 Unity Asset Store 上&#xff0c;大多数塔防模板都遵循一个经典逻辑&#xff1a;敌人走路径&#xff0c;玩家建塔防守。 但今天这个插件 Snake Army Defense - Complete Mobile Game Template&#xff0c;做了一件很有意思的事——它把传统塔防玩法“反过来了”。 敌人不…...

【c++面向对象编程】第3篇:类与对象(二):构造函数与析构函数

目录 一、一个让人头疼的问题 二、构造函数&#xff1a;对象出生时的“第一声啼哭” 1. 最基本的构造函数 2. 带参数的构造函数&#xff08;重载&#xff09; 3. 初始化列表&#xff1a;更高效的初始化方式 三、默认构造函数&#xff1a;那个“看不见”的函数 四、析构函…...

软件设计原则之OCP开闭原则

(OCP) 开闭原则 Open Closed Principle核心原则对扩展开放&#xff0c;对修改关闭。场景描述还是拿 UserInfo 进行举例。在开发过程中我们需要对我们使用的对象进行多步的组合操作&#xff0c;比如这里要打印账户和密码信息。常规的方式就是在外部直接进行调用&#xff0c;或者…...

量子测量诱导相变在玻色系统中的实验实现

1. 量子测量诱导相变的理论基础量子测量诱导相变&#xff08;Measurement-Induced Phase Transition, MIPT&#xff09;是近年来量子多体物理领域的重要发现。这种相变不同于传统热力学相变&#xff0c;它完全由量子测量操作与酉演化之间的动态竞争所驱动。在玻色系统中&#x…...