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

自定义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);
    // 恢复自定义状态
}


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

相关文章:

  • 【RabbitMQ】08-延迟消息
  • Django Form
  • 速盾:游戏盾的功能和原理详解
  • Redis安装(Windows环境)
  • Git - Think in Git
  • Playwright——快速入门(初章)
  • 专栏前言-WooYun漏洞库环境搭建
  • Java详解String 字符串类以及String内存原理、StringBuilder类、StringJoiner类(附有代码+案例)
  • MASt3R:从3D的角度来实现图像匹配(更新中)
  • 前端工程化2:从0-1的eslint插件开发教程
  • 基于Prometheus 和K8S kubernetes 构建 搭建监控告警系统
  • 单点登录:cas单点登录实现原理浅析
  • 【Vue】状态管理模式Vuex
  • 通信工程学习:什么是AM标准调幅
  • [情商-13]:语言的艺术:何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相!
  • Redis在登录接口中实现token时间的自适应增长
  • mysql5.6根据经纬度查询距离
  • 亚马逊测评深度解析:如何安全高效提升产品销量和好评
  • HTB-Pennyworth(cve查询 和 exp使用)
  • 《征服数据结构》差分数组
  • 【K8S实践笔记】Kubernetes Dashboard v2.7.0 的安装与配置(2)
  • 【Windows】【C++】【Udp】 udp通信协议详解和示例
  • 力扣 797. 所有可能路径【DFS】
  • 尚品汇-商品上下架完善(更新ES)、延迟消息(四十四)
  • CSDN文章无水印转成PDF
  • 【数据结构入门】排序算法之交换排序与归并排序