【Android、IOS、Flutter、鸿蒙、ReactNative 】自界说View

[复制链接]
发表于 2025-12-24 09:50:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Android Java 自界说View

步调

创建一个新的Java类,继承自View、ViewGroup或其他任何一个视图类。
假如必要,重写构造函数以支持差异的初始化方式。
重写onMeasure方法以提供精确的丈量逻辑。
重写onDraw方法以实现绘制逻辑。
根据必要重写其他方法,如onSizeChanged、onTouchEvent等。
自界说 View 
  1. public class CustomView extends View {
  2.     private Paint paint;
  3.     public CustomView(Context context) {
  4.         super(context);
  5.         init();
  6.     }
  7.     public CustomView(Context context, @Nullable AttributeSet attrs) {
  8.         super(context, attrs);
  9.         init();
  10.     }
  11.     private void init() {
  12.         paint = new Paint();
  13.         paint.setColor(Color.BLUE);
  14.         paint.setStyle(Paint.Style.FILL);
  15.     }
  16.     @Override
  17.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  18.         int defaultSize = 200;
  19.         setMeasuredDimension(
  20.             getDefaultSize(defaultSize, widthMeasureSpec),
  21.             getDefaultSize(defaultSize, heightMeasureSpec)
  22.         );
  23.     }
  24.     @Override
  25.     protected void onDraw(Canvas canvas) {
  26.         super.onDraw(canvas);
  27.         // 绘制一个简单的蓝色圆形
  28.         canvas.drawCircle(getWidth() / 2, getHeight() / 2, 100, paint);
  29.     }
  30. }
复制代码
  1. <com.example.yourapplication.CustomView
  2.     android:layout_width="wrap_content"
  3.     android:layout_height="wrap_content" />
复制代码
Android Java 自界说View

步调

创建一个新的Kotlin类,继承自View或其子类(如TextView, LinearLayout等)。
重写构造函数,至少提供一个可以大概担当Context和AttributeSet的构造函数。
假如必要,重写其他构造函数。
重写onMeasure方法以提供精确的丈量逻辑。
重写onDraw方法以提供绘制逻辑。
根据必要重写其他方法,如onSizeChanged,onTouchEvent等。
自界说View 
  1. import android.content.Context
  2. import android.graphics.Canvas
  3. import android.graphics.Color
  4. import android.graphics.Paint
  5. import android.util.AttributeSet
  6. import android.view.View
  7. class CustomView @JvmOverloads constructor(
  8.     context: Context,
  9.     attrs: AttributeSet? = null,
  10.     defStyleAttr: Int = 0
  11. ) : View(context, attrs, defStyleAttr) {
  12.     private val paint = Paint().apply {
  13.         color = Color.RED
  14.         strokeWidth = 5f
  15.     }
  16.     override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
  17.         // 设置默认的大小
  18.         val defaultSize = 200
  19.         setMeasuredDimension(
  20.             resolveSize(defaultSize, widthMeasureSpec),
  21.             resolveSize(defaultSize, heightMeasureSpec)
  22.         )
  23.     }
  24.     override fun onDraw(canvas: Canvas) {
  25.         super.onDraw(canvas)
  26.         // 绘制一个简单的矩形
  27.         canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)
  28.     }
  29. }
复制代码
ios Object-c 自界说 View

在Objective-C中创建自界说视图通常涉及到继承自UIView类并实现自界说的初始化方法、画图方法和其他必要的方法。以下是一个简朴的自界说视图的例子:
 自界说View
  1. // MyCustomView.h
  2. #import <UIKit/UIKit.h>
  3. @interface MyCustomView : UIView
  4. @end
  5. // MyCustomView.m
  6. #import "MyCustomView.h"
  7. @implementation MyCustomView
  8. // 初始化方法,可以自定义或使用默认的初始化方法
  9. - (instancetype)initWithFrame:(CGRect)frame {
  10.     self = [super initWithFrame:frame];
  11.     if (self) {
  12.         // 自定义初始化代码
  13.     }
  14.     return self;
  15. }
  16. // 当视图需要重绘时调用
  17. - (void)drawRect:(CGRect)rect {
  18.     // 获取图形上下文
  19.     CGContextRef context = UIGraphicsGetCurrentContext();
  20.    
  21.     // 在这里绘制图形或图像
  22.     // 例如,绘制一个简单的红色矩形
  23.     CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
  24.     CGContextFillRect(context, rect);
  25. }
  26. @end
复制代码
  1. // 在你的视图控制器中
  2. #import "MyCustomView.h"
  3. // ...
  4. MyCustomView *customView = [[MyCustomView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
  5. [self.view addSubview:customView];
复制代码
IOS Swift 自界说 View

在Swift中创建自界说视图通常涉及到界说一个继承自UIView的新类,而且通常必要重写init(frame和layoutSubviews()方法。以下是一个简朴的自界说视图的例子:
  1. import UIKit
  2. class CustomView: UIView {
  3.     // 自定义视图的初始化
  4.     override init(frame: CGRect) {
  5.         super.init(frame: frame)
  6.         setupView()
  7.     }
  8.    
  9.     // 使用Storyboard或者XIB时需要的初始化方法
  10.     required init?(coder aDecoder: NSCoder) {
  11.         super.init(coder: aDecoder)
  12.         setupView()
  13.     }
  14.    
  15.     // 视图布局发生变化时调用
  16.     override func layoutSubviews() {
  17.         super.layoutSubviews()
  18.         // 在这里可以根据视图的新布局进行调整
  19.     }
  20.    
  21.     // 设置视图的共有属性
  22.     private func setupView() {
  23.         backgroundColor = .blue // 设置背景颜色为蓝色
  24.         // 其他自定义设置...
  25.     }
  26.    
  27.     // 可以添加更多自定义的方法和属性
  28. }
复制代码
  1. class ViewController: UIViewController {
  2.     override func viewDidLoad() {
  3.         super.viewDidLoad()
  4.         
  5.         let customView = CustomView()
  6.         customView.frame = CGRect(x: 50, y: 100, width: 200, height: 200)
  7.         view.addSubview(customView)
  8.     }
  9. }
复制代码
HarmonyOS Next 自界说View

@Component 表现这是一个自界说组件
@Entry 表现该自界说组件为入口组件
@State 表现组件中的状态变量,状态变量厘革会触发UI革新
UI部门 :以声明式的方式来形貌UI的布局
  1. @Component
  2. export struct HelloPage {
  3.   @State message: string = 'Hello World'
  4.   build() {
  5.     Row() {
  6.       Column() {
  7.         Text(this.message)
  8.           .fontSize(40)
  9.           .fontWeight(FontWeight.Bold)
  10.           .onClick(() => {
  11.             this.message = "Hello Harmonyos"
  12.           })
  13.       }
  14.       .width('100%')
  15.     }
  16.     .height('100%')
  17.   }
  18. }
复制代码
React Native 自界说组件

形貌

界说组件布局: 利用 JSX 界说组件的 UI 布局。
界说组件样式: 利用 StyleSheet 或内联样式界说组件的样式。
处置惩罚组件逻辑: 利用 React Hooks(如 useState, useEffect)管理组件状态和副作用。
界说组件接口: 通过 props 通报数据和变乱处置惩罚器,实现组件的可设置性。
自界说组件 
  1. // components/MyButton.js
  2. import React from 'react';
  3. import { TouchableOpacity, Text, StyleSheet } from 'react-native';
  4. const MyButton = ({ title, onPress, style, textStyle }) => {
  5.   return (
  6.     <TouchableOpacity style={[styles.button, style]} onPress={onPress}>
  7.       <Text style={[styles.text, textStyle]}>{title}</Text>
  8.     </TouchableOpacity>
  9.   );
  10. };
  11. const styles = StyleSheet.create({
  12.   button: {
  13.     backgroundColor: '#007bff',
  14.     padding: 10,
  15.     borderRadius: 5,
  16.     alignItems: 'center',
  17.   },
  18.   text: {
  19.     color: '#fff',
  20.     fontSize: 16,
  21.   },
  22. });
  23. export default MyButton;
复制代码
  1. // screens/HomeScreen.js
  2. import React from 'react';
  3. import { View, StyleSheet } from 'react-native';
  4. import MyButton from '../components/MyButton';
  5. const HomeScreen = () => {
  6.   const handlePress = () => {
  7.     alert('Button Pressed!');
  8.   };
  9.   return (
  10.     <View style={styles.container}>
  11.       <MyButton title="Press Me" onPress={handlePress} />
  12.       <MyButton title="Custom Style" onPress={handlePress} style={{ backgroundColor: '#28a745' }} textStyle={{ fontSize: 18 }} />
  13.     </View>
  14.   );
  15. };
  16. const styles = StyleSheet.create({
  17.   container: {
  18.     flex: 1,
  19.     justifyContent: 'center',
  20.     alignItems: 'center',
  21.     padding: 20,
  22.   },
  23. });
  24. export default HomeScreen;
复制代码
Flutter 自界说Widget

形貌

创建一个新的Dart文件。
导入须要的Flutter库。
界说一个继承自StatelessWidget或StatefulWidget的类。
重写build方法以返回一个Widget。
自界说Widget 
  1. import 'package:flutter/material.dart';
  2. class CustomButton extends StatelessWidget {
  3.   final String label;
  4.   final VoidCallback onPressed;
  5.   const CustomButton({Key? key, required this.label, required this.onPressed}) : super(key: key);
  6.   @override
  7.   Widget build(BuildContext context) {
  8.     return ElevatedButton(
  9.       onPressed: onPressed,
  10.       child: Text(label),
  11.     );
  12.   }
  13. }
复制代码
CustomButton是一个继承自StatelessWidget的自界说Widget,它担当两个参数:label和onPressed。build方法返回一个ElevatedButton,它是Flutter提供的一个按钮Widget,并利用构造函数中传入的参数。
  1. void main() {
  2.   runApp(MyApp());
  3. }
  4. class MyApp extends StatelessWidget {
  5.   @override
  6.   Widget build(BuildContext context) {
  7.     return MaterialApp(
  8.       home: Scaffold(
  9.         body: Center(
  10.           child: CustomButton(
  11.             label: 'Click Me',
  12.             onPressed: () {
  13.               // Handle button press
  14.             },
  15.           ),
  16.         ),
  17.       ),
  18.     );
  19.   }
  20. }
复制代码
 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表