这个星期自己尝试些了一个,屏幕滑动时的Indicator,收获还是蛮多的,包括Scroller一些用法,onMeasure,onDraw和onLayout更深入的理解。
onMeasure:如果是子View,就测量View的尺寸(根据layout_width和layout_height),如果是父View,类似LinearLayout,就根据父View的排布特性来确定子View的尺寸。
onLayout:确定各个View在画面中的坐标。
onDraw:绘制图形了。
之前做下拉刷新控件的时候,想得到headview的宽高,结果发现headview.getHeight()出来的是0,后来查到原因是,Activity在onCreate()时界面不可见,内存组件还没有被绘制出来。
后来发现了一个简单的方法
public void measureview(View v){ int widthSpec=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED) int heightSpec=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED) v.measure(widthSpec,heightSpec); int height=v.getMeasuredHeight(); int width=v.getMeasuredWidth(); }这里出现了一个MeasureSpec,它是Measure这类方法中很重要的一个变量,暂且叫它为测量规格,int类型,高16bit表示MODE,低16bit表示SIZE,其中MODE中分为EXACTLY,AT_MOST,UNSPECIFIED三种,是由XML文件中的layout_width和layout_height来控制的。这个函数很明显就是创建了宽高的测量规格,然后用规格给measure了一下,就在组件初始化之前提前调用了这个View的measure和onMeasure(在measure方法中调用)方法,得知了它们测量的宽高。
然而这种方法也有它的缺陷,缺陷在哪里?
我们很容易知道一个View的大小是由它自己的大小和父View的布局和大小等因素决定的,由于这个函数是单纯的测量子View的尺寸,没有考虑到其他的因素,所以XML文件布局中当父View对它有影响的时候,是不太适合使用的。
这里还是要推荐一下自己写的IndicatorView,虽然写的不太好,有机会一定完善一下!
github地址:https://github.com/buptljy/ViewPagerIndicator
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于