续一个使用openGL渲染的炫丽Android动画库
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.
}
}