设为首页 加入收藏

TOP

Android 自定义 View 浅析(二)
2017-10-11 17:06:12 】 浏览:5589
Tags:Android 定义 View 浅析
ble.WeekSelectView_lineWidth, Defalut_Line_Width); space=typedArray.getDimension(R.styleable.WeekSelectView_space,Defalut_Space); typedArray.recycle();

代码比较简单,我就不详细说了,唯一要注意的就是不要忘了释放这个资源

2. 计算大小

好了,当我们获取到了 view 的一些初始化值之后呢,我们得计算我们的 view 的大小了!那怎么计算 view 的大小呢?只要覆写 onMeasure(int widthMeasureSpec, int heightMeasureSpec) 这个方法就行了。但在覆写这个方法之前,我们先得了解几个方法

MeasureSpec.getSize(int value) 这个方法是用来获取对应的宽高的!

MeasureSpec.getMode(int value) 这个方法是用来获取对应的宽高的模式的!这了模式有这个三个:

  • MeasureSpec.EXACTLY

精确值模式,当layout_width或layout_height指定为具体数值,或者为match_parent时,系统使用EXACTLY

  • MeasureSpec.AT_MOST

    最大值模式,指定为wrap_content时,控件的尺寸不能超过父控件允许的最大尺寸

  • MeasureSpec.UNSPECIFIED

    不指定测量模式,View想多大就多大,一般不太使用

这个给出常用的覆写这个方法的代码:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthSize=MeasureSpec.getSize(widthMeasureSpec);
    int widthMode=MeasureSpec.getMode(widthMeasureSpec);
    int heightSize=MeasureSpec.getSize(heightMeasureSpec);
    int heightMode=MeasureSpec.getMode(heightMeasureSpec);
    if (widthMode==MeasureSpec.EXACTLY){
        width=widthSize;
        lineWidth=(width-itemlength*selectSize-getPaddingRight()-getPaddingLeft()-              textRect.width())/(itemlength-1);
    }else{
        width= (int) (selectSize*(itemlength)+lineWidth*(itemlength-1)+textRect.width());
    }

    if (heightMode==MeasureSpec.EXACTLY){
        height=heightSize;
    }else{
        height= (int) (selectSize+space+textRect.height()+paddingTop);
    }
    setMeasuredDimension(width, height);
}

一般而言,当用户设置了具体的宽高的时候,我们使用设置的,如果没有,我们自己计算对应的宽高,最后设置!当完成这一步之后,我么就可以使用 getMeasuredWidth(),getMeasuredHeight() 这两个方法来获取 view 对应的高度了!

3. 绘制

好了,到了这一步,我们只要覆写 onDraw(Canvas canvas) 这个方法就行了,至于要绘制什么,这个是由开发者自己决定的。这里大家住一个问题,就是不要在方法中创建类,要不然会非常的耗资源!!如果大家想绘制出非常炫酷的图形或者效果来,那就得去学学 Canvas 这个类了!!这里给个链接 学习 Canvas

不同点

这里我要说的不同点就是如果继承了 viewgroup 之后,要多覆写一个方法 onLayout() 这个方法就是用来设置子view的位置的!
现在只有你覆写了这个方法之后 ,getHeight()getWidth() 才能获取到对应的值!现在可能有读者要问了,这两个方法和上面的 getMeasuredWidth(),getMeasuredHeight() 这两个方法有什么区别?却别就是

  • getHeight : 就是当前view中的可视高度
  • getMeasuredHeight:就是view的内容高度,包括不可见的地方

其他要到说的

自定义view 还有一个比较重要的问题,就是触摸事件,就是 touch 事件 在这个要涉及的问题就是 android 中触摸事件的传递机制了,这个也给个链接 android 触摸事件传递机制学习

如果触摸相关的已经学习好了,就可以在学习一下 android 动画的相关知识了,毕竟动态的事物比静态的要吸引人啊!这个在给出 android 动画学习

最后

希望大家都能学会 android 自定义 view 这个看似高大上的技能,因为这个在 android 开发中太常用了!!!!

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇安卓状态栏通知Status Bar Notifi.. 下一篇Android -- Apk安装简诉

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目