自定义View。

之前模模糊糊的谢过一些自定义View,一直希望能有更深的了解。
教材一

简单的显示–onDraw()

在这里我和教材并不是完全相同
关键差异

//(3参数)构造方法
public JQ_TextView(Context context, AttributeSet attrs, int defStyleAttr)
  {
      super(context, attrs, defStyleAttr);
      /**把我们的自定义属性放到TypedArray中*/
      TypedArray typedArray = context.getTheme()
                                     .obtainStyledAttributes(attrs, R.styleable.JQ_TextView,
                                                             defStyleAttr, 0);
      for (int i = 0; i < typedArray.length(); i++)
      {

          switch (i)
          {
              case R.styleable.JQ_TextView_textColor:
                  this.textColor = typedArray.getColor(i, Color.BLUE);
                  break;
              case R.styleable.JQ_TextView_textSize:
                  this.textSize = typedArray.getDimension(i, 200);
                  break;
              case R.styleable.JQ_TextView_backgroundColor:
                  this.backgroundColor = typedArray.getColor(i, Color.WHITE);
                  break;
              case R.styleable.JQ_TextView_text:
                  this.text = typedArray.getString(i);
                  this.text = this.text == null ? "" : this.text;//防止报空指针
                  break;
          }
      }
      typedArray.recycle();
  }

我的看法:这个 for循环是为了给我们的自定义属性,赋予我们自定义的值,索引从min–max就是我们的 attr.xml 文件中所自定义的属性从上到下,也就是索引从 0 到 max(4)
attr.xml
这里有一点:就是这个XML文件名不必要是attr,只要你乐意随便是amao,agou。重要的在于内容,只要节点符合规格就没得问题。

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <!--这里是JQ_TextView的自定义属性,我们要了解到,这个XML文件中的一些规则-->
  <declare-styleable name="JQ_TextView">
      <attr name="textColor" format="color"/>
      <attr name="textSize" format="dimension"/>
      <attr name="backgroundColor" format="color"/>
      <attr name="text" format="string"/>
  </declare-styleable>
</resources>

按教材,并不能完美实现,我没有考虑为什么。
总之我的第一步就这么开始并且这么结束了。
接下来我们要显示变得可控。

控制显示位置onMeasure()探索

首先把文字放到空间的中心



小插曲

我们需要了解的两个知识:1,View的坐标怎么样的;2,文字本身属性的获取;
* 关于Rect类有人说···
我们要注意的是那四个参数代表左上角和右下角的两个坐标

  • 关于第一个问题通过 View.getX(),View.getY()两个方法可以判断:子View的坐标是相对于父亲View而言的,不是相对于屏幕而言的。
  • 关于获取文字属性(宽/高):参考
  • 自行测试图片


关于控件大小的显示

开始之前难免疑问?我们从别人的博客得到这些结论,他们的结论是怎么得出来的,现在我认为是从源码。但是我感觉源码太长,太多,也有太多知识没有储备,总是耐不住性子去看。

  • 系统帮我们测量的高度和宽度都是MATCH_PARNET,当我们设置明确的宽度和高度时,系统帮我们测量的结果就是我们设置的结果,当我们设置为WRAP_CONTENT,或者MATCH_PARENT系统帮我们测量的结果就是MATCH_PARENT的长度。
    所以,当设置了WRAP_CONTENT时,我们需要自己进行测量,即重写onMesure方法”:
    重写之前先了解MeasureSpec的specMode,一共三种类型:

  • EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
    AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
    UNSPECIFIED:表示子布局想要多大就多大,很少使用(我是不知道什么时候出现的。)

  • !!深度好文!!
    关于MeasureSpaec的一些个人了解

当我们要知道使用WARP_CONTENT时所需要的控件宽高的时候就需要计算了,这时候我们就必须知道有什么附加的宽和高。例如如果继承View的话就需要知道Padding····但是还有别的吗?我们查阅下文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值