续
MagicSurfaceView v1.1.0发布, 新增碎片化曲面动画
地址:https://github.com/gplibs/android-magic-surface-view示例效果 :
新增 MagicMultiSurface
// 创建一个多曲面MagicMultiSurface对象MagicMultiSurface multiSurface = new MagicMultiSurface(view, 20, 10) // view为要进行动画操作的View, (20,10)表示将曲面分解成 20行 10列 共两百个子曲面 .setUpdater(mMultiUpdater) // 设置 MagicMultiSurfaceUpdater 对子曲面进行动画操作 详情见 "MagicMultiSurfaceUpdater" .setVisible(true) // 设置模型是否要渲染 (默认为true) .setShininess(64) // 设置模型材质光泽度,默认64; 数值越大越光滑, 只对光照生效,无光照效果可忽略. .setEnableBlend(true) // 是否开启混合,为透明对象时需开启,(默认为开启) .setEnableDepthTest(true); // 是否开启深度测试,开启后会按三维坐标正常显示,如果关闭,绘制时将覆盖之前已经绘制的东西,(默认为开启)
及对应 MagicMultiSurfaceUpdater
MagicMultiSurfaceUpdater 对 MagicMultiSurface 中每个子模型进行矩阵变换及颜色值修改,
调用过程为 willStart -> didStart -> (updateBegin -> (update [遍历每个子模型]) -> updateEnd [此部分通过notifyChanged触发,循环调用直到 调用 Updater stop方法]) -> didStop
public class MyMultiSurfaceUpdater extends MagicMultiSurfaceUpdater { // 在绘制第一帧之前调用 (可以在此方法里进行一些初始化操作) @Override protected abstract void willStart(MagicMultiSurface surface) { } // 在开始绘制后调用(绘制第一帧后调用,一般动画可以在此开始) // 动画有更新时,需调用 notifyChanged()方法 通知框架可以调用 update 相关方法进行更新。 @Override protected abstract void didStart(MagicMultiSurface surface) { } // 当调用 updater stop方法之后,真正停止后会回调此方法 @Override protected abstract void didStop(MagicMultiSurface surface) { } // 每次各子模型更新之前调用 @Override protected abstract void updateBegin(MagicMultiSurface surface) { } /** * 修改r行 c列处子模型的矩阵matrix, 及子模型颜色color * @param surface * @param r 行 * @param c 列 * @param matrix 矩阵 * @param offset 偏移量 (跟MagicSurfaceMatrixUpdater中偏移量一样的意义,只是此处为某个子模型的偏移量) * @param color 默认值为 rgba(1,1,1,1), 计算完成后的新颜色要更新到此变量 模型最终颜色计算方法参考 "顶点最终颜色计算过程" */ @Override protected abstract void update(MagicMultiSurface surface, int r, int c, float[] matrix, Vec offset, Vec color) { // 重置矩阵 // reset(matrix); // 平移 // translate(matrix, offset); // 旋转 //rotate(matrix, mAxis, angle); // 缩放 //scale(matrix, mScale); // 修改颜色 // color.setColor(xxx); } // 每次所有子模型更新完成后调用 @Override protected abstract void updateEnd(MagicMultiSurface surface) { // 可以在此方法里判断动画是否结束,结束需调用 stop()方法,以结束updater. }}