返回介绍

绘制

发布于 2024-12-23 21:01:01 字数 1647 浏览 0 评论 0 收藏 0

protected void onDraw(Canvas canvas) {
  final Drawable buttonDrawable = mButtonDrawable;
  if (buttonDrawable != null) {
    final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;
    final int drawableHeight = buttonDrawable.getIntrinsicHeight();
    final int drawableWidth = buttonDrawable.getIntrinsicWidth();

    final int top;
    switch (verticalGravity) {
      case Gravity.BOTTOM:
        top = getHeight() - drawableHeight;
        break;
      case Gravity.CENTER_VERTICAL:
        top = (getHeight() - drawableHeight) / 2;
        break;
      default:
        top = 0;
    }
    final int bottom = top + drawableHeight;
    final int left = isLayoutRtl() ? getWidth() - drawableWidth : 0;
    final int right = isLayoutRtl() ? getWidth() : drawableWidth;

    buttonDrawable.setBounds(left, top, right, bottom);

    final Drawable background = getBackground();
    if (background != null) {
      background.setHotspotBounds(left, top, right, bottom);
    }
  }

  super.onDraw(canvas);

  if (buttonDrawable != null) {
    final int scrollX = mScrollX;
    final int scrollY = mScrollY;
    if (scrollX == 0 && scrollY == 0) {
      buttonDrawable.draw(canvas);
    } else {
      canvas.translate(scrollX, scrollY);
      buttonDrawable.draw(canvas);
      canvas.translate(-scrollX, -scrollY);
    }
  }
}

这些属性都初始化好了,那就可以来绘制了,我们都知道自定义重写 onDraw() 方法来绘制视图,CompoundButton 也重写了此方法,将我们设置了各种属性的 mButtonDrawable 复制给局部变量 buttonDrawable,然后根据对其方式(Gravity) 属性来来具体绘制 buttonDrawable。

然后调用父类的 onDraw(),最后在根据时候是滑动通过 Canvas 来绘制,如果水平和垂直滑动为 0,则直接绘制即可,如果不为零则需要调用 translate 对 canvas 的重新绘制。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文