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

【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);
    }
 
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int defaultSize = 200;
        setMeasuredDimension(
            getDefaultSize(defaultSize, widthMeasureSpec),
            getDefaultSize(defaultSize, heightMeasureSpec)
        );
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 绘制一个简单的蓝色圆形
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, 100, paint);
    }
}
<com.example.yourapplication.CustomView
    android: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.View
 
class CustomView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
 
    private val paint = Paint().apply {
        color = Color.RED
        strokeWidth = 5f
    }
 
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        // 设置默认的大小
        val defaultSize = 200
        setMeasuredDimension(
            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 UIKit
 
class 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);
 
  @override
  Widget 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 {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: CustomButton(
            label: 'Click Me',
            onPressed: () {
              // Handle button press
            },
          ),
        ),
      ),
    );
  }
}

 


http://www.kler.cn/a/405144.html

相关文章:

  • 介绍一下strncmp(c基础)
  • 【智谱清言-注册_登录安全分析报告】
  • NLP论文速读(多伦多大学)|利用人类偏好校准来调整机器翻译的元指标
  • Qt:信号槽
  • SpringAOP模拟实现
  • 每日一题&移动语义
  • 力扣 LeetCode 513. 找树左下角的值(Day8:二叉树)
  • [服务器] 腾讯云服务器免费体验,成功部署网站
  • PBDL (基于物理的深度学习)-Chapter 1
  • 深度学习day2-Tensor 2
  • 【Git】git从暂存区中移除文件
  • 山泽HDMI切换器:提升家庭娱乐与办公体验的利器
  • 支持向量机SVM——基于分类问题的监督学习算法
  • HBase 原理
  • 蓝桥杯每日真题 - 第19天
  • 第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞
  • 生产环境centos8 Red Hat8部署ansible and 一键部署mysql两主两从ansible脚本预告
  • 经验笔记:远端仓库和本地仓库之间的连接(以Gitee为例)
  • 在Sui 区块链上创建、部署和管理 NFT 的完整教程
  • java 设计模式 模板方法模式
  • shell脚本-笔记25
  • leetcode105:从前序与中序遍历构建二叉树
  • Java API 学习指南:从入门到精通的全面指导
  • 2.13 转换矩阵
  • 【数据库知识】mysql进阶-Mysql数据库的主从复制
  • Spring Boot核心概念:日志管理