【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View
Android Java 自定义View
步骤
创建一个新的Java类,继承自
View
、ViewGroup
或其他任何一个视图类。如果需要,重写构造函数以支持不同的初始化方式。
重写
onMeasure
方法以提供正确的测量逻辑。重写
onDraw
方法以实现绘制逻辑。根据需要重写其他方法,如
onSizeChanged
、onTouchEvent
等。
自定义 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
或其子类(如TextView
,LinearLayout
等)。重写构造函数,至少提供一个能够接受
Context
和AttributeSet
的构造函数。如果需要,重写其他构造函数。
重写
onMeasure
方法以提供正确的测量逻辑。重写
onDraw
方法以提供绘制逻辑。根据需要重写其他方法,如
onSizeChanged
,onTouchEvent
等。
自定义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库。
定义一个继承自
StatelessWidget
或StatefulWidget
的类。重写
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,它接受两个参数:label
和onPressed
。build
方法返回一个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类,继承自View、ViewGroup或其他任何一个视图类。 如果需要,重写构造函数以支持不同的初始化方式。 重写onMeasure方法以提供正确的测量逻辑。 重写onDraw方法以实现绘制逻辑。 根据需要重写其他方法&…...

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

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

C# 面向对象
C# 面向对象编程 面向过程:一件事情分成多个步骤来完成。 把大象装进冰箱 (面向过程化设计思想)。走一步看一步。 1、打开冰箱门 2、把大象放进冰箱 3、关闭冰箱门 面向对象:以对象作为主体 把大象装进冰箱 1、抽取对象 大象 冰箱 门 ࿰…...
android wifi扫描的capability
混合型加密android11 8155与普通linux设备扫描到的安全字段差别 android应用拿到关于wifi安全的字段: 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 正规浮点数(fp32)1.3.2 非正规浮点数(fp32)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多变量回归预测,本征正交分解数据降维融合Transformer多变量回归预测,使用SVD进行POD分解(本征正交分解); 2.运行环境Matlab20…...

Hadoop生态圈框架部署(七)- MySQL安装与配置教程
文章目录 前言一、MySQL安装与配置(手动部署)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网络覆盖
方案背景 视频直播蓬勃发展的当下,传统直播网络联网方式的局限性越来越明显。目前传统直播的局限性主要集中在以下几个方面: 传统直播间网络架构条件有限,可连接WIFI数量少,多终端同时直播难以维持;目前4G网络带宽有限…...
技术周刊 |Google 2024 年首届 Web AI 峰会回顾
大家好,我是童欧巴。见字如面,万事胜意,欢迎来到第 134 期周刊。 大厨推荐 Google 2024 年首届 Web AI 峰会回顾 不仅包括来自谷歌团队的演讲者,如 Chrome 和 MediaPipe,还包括第三方代表,如英特尔、Hug…...

web——upload-labs——第十二关——%00截断
查看源码 分析源码我们可以知道,这里是基于白名单过滤,只允许上传jpg,png,gif,但是这里注意第八行,上传路径是可以控制的,所以可以利用%00截断,来达到上传木马的目的。这里要注意一下,%00截断想…...
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值。ojdbc8版本23.2.0.0驱动BUG【已解决】
问题描述 JDK8使用ojdbc8驱动操作oracle11g数据库,使用JDBC复用 PreparedStatement 对象执行Insert操作时,报错java.sql.SQLException: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值。,经测试发现,是预编译对象某个占位符号被赋…...

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

报错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.第一步:在pom文件中将lombok的版本改成最新的 此时1.18.34是新…...

前端三大件之CSS
引言 CSS(层叠样式表,Cascading Style Sheets)是一种用于描述网页文档外观和格式的样式表语言。它主要用于控制网页的布局、颜色、字体、间距等视觉效果,使开发者能够将内容与设计分离。 一,CSS的基本概念 选择器&…...
C语言 | 指针 | 野指针 | 数组指针 | 指针数组 | 二级指针 | 函数指针 | 指针函数
文章目录 1.指针的定义2.指针的加减运算3.野指针4.指针 & 数组 & 传参 & 字符数组5.数组指针 & 指针数组6.二级指针7.指针函数 & 函数指针 & 回调函数8.函数指针数组 & 指向函数指针数组的指针 1.指针的定义 指针是内存中一个最小单元的编号&…...
mysql 的乐观锁和 mvcc 是一回事吗
MySQL 的乐观锁和 MVCC(多版本并发控制)是两个不同的概念,尽管它们都涉及到并发控制和数据的一致性,但在设计目的和实现方式上存在本质区别。 1. 乐观锁 概念 乐观锁是一种用于解决并发更新冲突的控制机制。它假设数据在大部分情况…...
redis的击穿和雪崩
Redis 是一个高性能的键值存储数据库,广泛用于缓存、会话管理等场景。然而,Redis 在高并发场景下可能会遇到一些问题,比如“击穿”和“雪崩”。下面详细解释这两个概念: 击穿(Hotspot) 击穿是指某个热点数…...

java中创建多线程的4种方式
目录 一、继承 Thread 类创建线程 步骤 示例代码 原理 二、实现 Runnable 接口创建线程 步骤 示例代码 原理 三、实现 Callable 接口创建线程 步骤 示例代码 原理 与Runnable接口相比的不同之处 四、使用线程池创建线程 步骤 示例代码(使用 Executo…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...