返回介绍

分析

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

// 选中和未选中的状态
private boolean mChecked;

private boolean mBroadcasting;

private Drawable mButtonDrawable;

private ColorStateList mButtonTintList = null;
// 就是水波纹和背景颜色混合的方式
private PorterDuff.Mode mButtonTintMode = null;

private boolean mHasButtonTint = false;
private boolean mHasButtonTintMode = false;

// 状态监听
private OnCheckedChangeListener mOnCheckedChangeListener;
private OnCheckedChangeListener mOnCheckedChangeWidgetListener;

这是一些局部变量,在后面的分析会用到。

我们先来看看 CompoundButton 自定义控件有哪些属性 \data\res\values\attrs.xml

 <declare-styleable name="CompoundButton">
    <!-- 设置状态  true: 选中; false: 未选中 -->
    <attr name="checked" format="boolean" />
    <!-- 绘制按钮图形,一般为 Drawable 资源 (e.g. checkbox, radio button, etc). -->
    <attr name="button" format="reference" />
    <!-- 对绘制的按钮图形着色 -->
    <attr name="buttonTint" format="color" />
    <!-- 对着色设置模式 -->
    <attr name="buttonTintMode">
      <enum name="src_over" value="3" />
      ...
    </attr>
  </declare-styleable>

然后再来看看怎么绘制,先来看看构造方法

public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  super(context, attrs, defStyleAttr, defStyleRes);

  // 这里的获取自定义的 CompoundButton 就是上面的定义的 CompoundButton
  final TypedArray a = context.obtainStyledAttributes(
      attrs, com.android.internal.R.styleable.CompoundButton, defStyleAttr, defStyleRes);

  // 用于绘制按钮图形
  final Drawable d = a.getDrawable(com.android.internal.R.styleable.CompoundButton_button);
  if (d != null) {
    setButtonDrawable(d);
  }

  // 对绘制的按钮图形着色设置模式
  if (a.hasValue(R.styleable.CompoundButton_buttonTintMode)) {
    mButtonTintMode = Drawable.parseTintMode(a.getInt(
        R.styleable.CompoundButton_buttonTintMode, -1), mButtonTintMode);
    mHasButtonTintMode = true;
  }

  // 对绘制的按钮图形着色
  if (a.hasValue(R.styleable.CompoundButton_buttonTint)) {
    mButtonTintList = a.getColorStateList(R.styleable.CompoundButton_buttonTint);
    mHasButtonTint = true;
  }

  // 设置状态
  final boolean checked = a.getBoolean(
      com.android.internal.R.styleable.CompoundButton_checked, false);
  setChecked(checked);

  a.re cycle();

  applyButtonTint();
}

在构造方法中,获取自定义属性的各个属性,

  • button:用于绘制按钮图形,然后调用 setButtonDrawable() 来绘制。
  • buttonTint:绘制的按钮着色。使用一个 boolean 标识符来设置的,然后会在 applyButtonTint() 中统一处理。它们两个分别用作给和
  • buttonTintMode:和设置着色模式。设置方式和 buttonTint 几乎一样。不过它的一些属性,参考这篇文章来看看具体不同的着色模式效果是怎么样的。
  • checked:是设置选中状态,在 setChecked() 中设置。

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

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

发布评论

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