自定义View之小细节

1.构造方法

  • 自定义属性
    ImageButtonWithText名字与自定义View名字一致,attr的名字要与其他自定义View的attr名字不同,不然会报错
<declare-styleable name="ImageButtonWithText">
        <attr name="text_img" format="string"/>
        ...
</declare-styleable>
  • 构造方法里获取自定义属性
 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageButtonWithText, 0, defStyle);
        if (a != null) {
            int n = a.getIndexCount();
            for (int i = 0; i < n; i++) {
                int attr = a.getIndex(i);
                switch (attr) {
                    case R.styleable.ImageButtonWithText_text_img:
                        text = a.getText(attr);
                        break;
                    ...     }
            }
        }
        a.recycle();
  • 构造方法里获取android内部属性
    比如想要获取com.android.internal.R.styleable.xxx这种属性,不能用类似于上面的方法,但可以用getXX()的方法访问到。

2.onMeasure()

  • 用途
    回调方法,比如measure里会调用它,我们一般重写它重新分配控件大小。
  • 测量控件大小
    这里主要会用到MeasureSpec类,这个方法里不能使用getWidth()这类方法,还有需要注意的就是最好不要写这种代码if(widthMode != MeasureSpec.EXACTLY),因为还有其他值是不在我们熟知的三种模式里任何一种。
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY) {
    mWidth = widthSize;
   } else {} 
setMeasuredDimension(mWidth, mHeight);//不能丢       

3.onLayout()

  • 用途
    回调方法,比如layout()里会调用它,一般当自定义的View为ViewGroup需要为子View分配位置时重写它。这里浅说了下layout机制

4.获取控件大小的几个方法

  • getWidth(),getHeight(),getLeft(),getTop()……
    这一类的方法我目前理解是在onMeasure()测量之后才能获取到值,这也就是为什么在onMeasure里最好别用它的原因,它返回的值是以像素为单位,是相对于父控件的位置,如果父控件也是根控件,我就一般用’可用’屏幕来说,不能跟整个屏幕搞混。
    这里提下View的mLeft这些属性,他是protected,但是我们继承了View也不能使用是因为不在同一包里,不过android给我们提供了上面这些方法来访问。
  • 注意这些方法与MeasureSpec.getSize()的区别
  • getX()和getY()
    相当于getX(0),是获取手指触摸的x坐标,具体说是第一个手指触摸的x坐标,相对于你触摸的控件本身而言的。里面的数字代表第几个手指。
  • getRawX()和getRawY();
    也是获取手指触摸的x坐标,但是相对于屏幕的位置,这里是相对整个屏幕的。

5.关于文字

  • 获取字体大小
FloatMath.ceil(Layout.getDesiredWidth("你的文字", "写这些文字需要用到的Paint对象"); //获取宽
"Paint对象".getFontMetrics().bottom - mTextPaint.getFontMetrics().top; //获取高
//FontMetrics是Paint的内部类,看他名字也大概猜到他干嘛的
  • 字体绘制
    canvas.drawText(“…”,x,y,mTextPaint)是从左下角开始绘制,我试验了下,感觉在左下角偏上一点点,所以x,y设置时要注意一下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值