ViewUtils

来源:互联网 发布:java简历专业技能 编辑:程序博客网 时间:2024/05/16 07:52
项目 ViewUtils的总结:


一般一个成熟长期的项目必然会有一堆XXXUtils/Helper之类的静态工具<当然了不是内部类,那么不能是static的,这里的静态指的是方法>/单例类,
这些类最大的作用是消除code duplicate,以及屏蔽实现细节,对于android这种API经常
变的平台,Utils包装细节可以很好的和系统版本解耦。
计划将这些Utils类整理一下维护到自己的github上去<早该搞了,自己的github上几乎全是Fork......>,以后不用再重新发明轮子。

这是另外一个哥们总结的,挺全。

http://blog.csdn.net/lmj623565791/article/details/38965311


简单总结一个ViewUtils的内容:
<1>提供一个oneshot的onLayout Listener,并将其加到View上,这个需求在项目中
的频率不高,不过View本身并没提供这样的Listener<只提供了onLayoutChangeListner>,
总不能为了监听onLayout而将View extends就为了override onLayout(), 所以利用ViewTreeOberver的OnGlobalLayoutListener实现了这个效果,因为是oneShot,那么在Listner
被调用的时候,就要将自己从ViewTreeOberver的listner中移除,
这里有个API兼容问题,GOOGLE蛋疼,在JB以下版本,是removeGlobalOnLayoutListener,在JB及以上是removeOnGlobalLayoutListener.........

<2>对于某个API兼容问题比较多的版本,会在里面再声明一个XXXCompat来封装其独有的方法,这样做的好处是直接在该class上加一个@TargetApi就够用了。

<3>硬件加速是否打开的判断:只有在 >= HC的情况下才有可能打开,真正判断是canvas的
isHardwareAccelerated()。

<4>设置View的background,GOOGLE继续做死,在>=JB,是setBackground(drawable),其他的是
setBackgroundDrawable(drawable)

<5>Rset View的MarginStart/End<基本和left/right一样,不过要考虑阅读语序>,在 >=JB_MR1时,直接设置View的LayoutParams的MarginStart/End: setMarginStart/End
(Integer.MIN_VALUE);
其他情况则需要调用反射来设置属性startMargin/endMargin。

<6>禁止多触摸点: >=HC 直接调用ViewGroup setMotionEventSplittingEnabled(false),以下版本默认就是不支持多触摸.

<7>设置View 的 VISIBLITY, 如果 SDK < HC, 那么设置前要 clearAnimation<这是一个著名的bug,不clear Animation, View永远可见,即使设了不可见>,否则如果要设置的VISIBLITY不是visible 那么还需要将View的alpha设为1<这是因为某些时候使用的Animation会调整View的alpha,因此在其被调整为不可见时,会将其alpha值reset为1>. 最后才执行原生setVisiblity。

<8>generateViewId, 这个功能个人用的很少,只有在 >=JB_MR1,才有直接的原生实现,否则,
参考这个实现: http://stackoverflow.com/questions/6790623/#21000252
0 0
原创粉丝点击