Displaying list items in a semi-circle with a nice fish eye effect. Android.
源代码 : https://github.com/dkmeteor/CircleList
角度/缩放比 可调
angle调至 180度 为半圆形
-------------------
主要效果为 Canvas和Matrix实现的效果,具体看源码就行了。
Java代码
这个地方单独解释一下,反射修改了ListView的一个私有成员变量mGroupFlags,该成员变量 最后4位 对应
FLAG_CLIP_CHILDREN , FLAG_CLIP_TO_PADDING , FLAG_INVALIDATE_REQUIRED 和 FLAG_RUN_ANIMATION
0xfffff8 末尾对应 1000
对应以上4个状态
在该状态下,ViewGroup dispatchDraw 的时候 不会调用 canvas.clipRect
这样ChildView 可以不受bounds限制绘制在ViewGroup任意位置.
具体流程在ViewGroup源码dispatchDraw部分
不知有没有更好的实现方式,反射修改私有成员变量总是不太好的.....
源代码 : https://github.com/dkmeteor/CircleList
角度/缩放比 可调
angle调至 180度 为半圆形
-------------------
主要效果为 Canvas和Matrix实现的效果,具体看源码就行了。
Java代码
- public void changeGroupFlag(Object obj) throws Exception
- {
- Field[] f = obj.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredFields(); // 获得成员映射数组
- for (Field tem : f)
- {
- if (tem.getName().equals("mGroupFlags")) {
- tem.setAccessible(true);
- Integer mGroupFlags = (Integer)tem.get(obj);
- int newGroupFlags = mGroupFlags & 0xfffff8;
- tem.set(obj, newGroupFlags);
- }
- }
- }
这个地方单独解释一下,反射修改了ListView的一个私有成员变量mGroupFlags,该成员变量 最后4位 对应
FLAG_CLIP_CHILDREN , FLAG_CLIP_TO_PADDING , FLAG_INVALIDATE_REQUIRED 和 FLAG_RUN_ANIMATION
0xfffff8 末尾对应 1000
对应以上4个状态
在该状态下,ViewGroup dispatchDraw 的时候 不会调用 canvas.clipRect
这样ChildView 可以不受bounds限制绘制在ViewGroup任意位置.
具体流程在ViewGroup源码dispatchDraw部分
不知有没有更好的实现方式,反射修改私有成员变量总是不太好的.....