首先感谢GitHUb上贡献开源项目 AndroidCharts的作者:dacer,我是在项目中K图也就是lineView代码基础上修改的。
项目地址:https://github.com/dacer/AndroidCharts
然后感谢CDSN博主 nekocode 我参照他的代码给lineView图 添加了纵坐标。
他的博文:http://blog.youkuaiyun.com/nekocode/article/details/18325459
然后非常感谢我的程序员小圈子 Android 开发者们 qq群里的大哥们,特别鸣谢@ 奔放蜗牛,帮我寻找解决办法到一点多,他明天还要上班呢。其他的少年不再一一列举,好兄弟!
最后步入正题:
我的需求:根据k图中画的线的数目动态调整view的大小,这里主要是高度,因为我的需求画出来的线都是水平线,因此线的数目与图的大小有直接关系。
问题:项目中view的大小是在xml文件中设定的,即是明确的数值,然后在LineView.java中 通过 重写的 onMeasure( )函数获取view的大小,将view的Height赋值给一个非常重要的参数:mViewHeight 因为从头到尾的所有draw操作的纵坐标都与这个参数与关,可以理解为mViewHeight就是这个画布的高,不论是画点,画线,还是显示纵坐标数据,都用到这个参数。这样设定的话,view的大小就是确定的。
修改办法:
1:在xml中将layout_height属性设置为 match_parent,
2:在refreshAfterDataChanged()函数中更新mViewHeight的值。因为每次更新数据之后,所有数据的x,y以及绘制都是在refreshAfterDataChanged()中实现的,所以将更新mViewHeight的代码放在这个函数中最优先位置。这样每次更新了数据先更新了mViewHeight的值,然后才开始绘制。
那么view的大小是怎么改变的呢?
因为在重写的onMeasure( )函数中调用了一次refreshAfterDataChanged()! 紧接着调用了setMeasuredDimension(mViewWidth,mViewHeight); 来调整view的大小。这时候我们的mViewHeight已经被更新了,所以传进setMeasuredDimension之后将view的大小调整到新的状态。
重要部分:
前后效果对比:
修改之前:
修改之后:
虽然解决了问题,但是知其然不知其所以然,关于onMeasure,measure,setMeasuredDimension来动态调整view大小的原理,下面两篇博文应该很不错:
继承ViewGroup:重写onMeasure方法和onLayout方法 http://www.cnblogs.com/fengzhblog/archive/2013/05/13/3075627.html
View和ViewGroup http://blog.youkuaiyun.com/linghu_java/article/details/8532988