一个使用 openGL 渲染的炫丽 Android 动画库二 (新增碎片化曲面动画)

1,906 阅读2分钟
原文链接: www.cnblogs.com

一个使用openGL渲染的炫丽Android动画库

MagicSurfaceView v1.1.0发布, 新增碎片化曲面动画
地址:github.com/gplibs/andr…

示例效果 :


新增 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.
    }
}