├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── Android ├── PlayerProj │ ├── .gitignore │ ├── LICENSE.txt │ ├── animplayer │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── publish.gradle │ │ └── src │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── tencent │ │ │ │ │ └── qgame │ │ │ │ │ └── animplayer │ │ │ │ │ ├── AnimConfig.kt │ │ │ │ │ ├── AnimConfigManager.kt │ │ │ │ │ ├── AnimPlayer.kt │ │ │ │ │ ├── AnimView.kt │ │ │ │ │ ├── AudioPlayer.kt │ │ │ │ │ ├── Constant.kt │ │ │ │ │ ├── Decoder.kt │ │ │ │ │ ├── EGLUtil.kt │ │ │ │ │ ├── HardDecoder.kt │ │ │ │ │ ├── IAnimView.kt │ │ │ │ │ ├── IRenderListener.kt │ │ │ │ │ ├── Render.kt │ │ │ │ │ ├── RenderConstant.kt │ │ │ │ │ ├── YUVRender.kt │ │ │ │ │ ├── YUVShader.kt │ │ │ │ │ ├── file │ │ │ │ │ ├── AssetsFileContainer.kt │ │ │ │ │ ├── FileContainer.kt │ │ │ │ │ ├── IFileContainer.kt │ │ │ │ │ ├── StreamContainer.kt │ │ │ │ │ └── StreamMediaDataSource.kt │ │ │ │ │ ├── inter │ │ │ │ │ ├── IAnimListener.kt │ │ │ │ │ ├── IFetchResource.kt │ │ │ │ │ └── OnResourceClickListener.kt │ │ │ │ │ ├── mask │ │ │ │ │ ├── MaskAnimPlugin.kt │ │ │ │ │ ├── MaskConfig.kt │ │ │ │ │ ├── MaskRender.kt │ │ │ │ │ └── MaskShader.kt │ │ │ │ │ ├── mix │ │ │ │ │ ├── Frame.kt │ │ │ │ │ ├── MixAnimPlugin.kt │ │ │ │ │ ├── MixRender.kt │ │ │ │ │ ├── MixShader.kt │ │ │ │ │ ├── MixTouch.kt │ │ │ │ │ ├── Resource.kt │ │ │ │ │ └── Src.kt │ │ │ │ │ ├── plugin │ │ │ │ │ ├── AnimPluginManager.kt │ │ │ │ │ └── IAnimPlugin.kt │ │ │ │ │ ├── textureview │ │ │ │ │ └── InnerTextureView.kt │ │ │ │ │ └── util │ │ │ │ │ ├── ALog.kt │ │ │ │ │ ├── BitmapUtil.kt │ │ │ │ │ ├── GlFloatArray.kt │ │ │ │ │ ├── MediaUtil.kt │ │ │ │ │ ├── ScaleTypeUtil.kt │ │ │ │ │ ├── ShaderUtil.kt │ │ │ │ │ ├── SpeedControlUtil.kt │ │ │ │ │ ├── TexCoordsUtil.kt │ │ │ │ │ ├── TextureLoadUtil.kt │ │ │ │ │ └── VertexUtil.kt │ │ │ └── res │ │ │ │ └── values │ │ │ │ └── strings.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── tencent │ │ │ └── qgame │ │ │ └── animplayer │ │ │ └── ExampleUnitTest.java │ ├── animtool │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── tencent │ │ │ └── qgame │ │ │ └── playerproj │ │ │ └── animtool │ │ │ ├── AnimTool.java │ │ │ ├── CommonArg.java │ │ │ ├── CommonArgTool.java │ │ │ ├── GetAlphaFrame.java │ │ │ ├── Main.java │ │ │ ├── Md5Util.java │ │ │ ├── Mp4BoxTool.java │ │ │ ├── ProcessUtil.java │ │ │ ├── TLog.java │ │ │ ├── data │ │ │ └── PointRect.java │ │ │ ├── ui │ │ │ ├── OpenSourceUI.java │ │ │ ├── ToolUI.java │ │ │ └── VapxUI.java │ │ │ └── vapx │ │ │ ├── FrameSet.java │ │ │ ├── GetMaskFrame.java │ │ │ └── SrcSet.java │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ ├── demo.mp4 │ │ │ │ ├── mask_blur_demo.mp4 │ │ │ │ ├── mask_trunk_demo.mp4 │ │ │ │ ├── special_size_750.mp4 │ │ │ │ └── vapx.mp4 │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── tencent │ │ │ │ │ └── qgame │ │ │ │ │ └── playerproj │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ └── player │ │ │ │ │ ├── AnimActiveDemoActivity.kt │ │ │ │ │ ├── AnimSimpleDemoActivity.kt │ │ │ │ │ ├── AnimSpecialSizeDemoActivity.kt │ │ │ │ │ ├── AnimVapxDemoActivity.kt │ │ │ │ │ └── FileUtil.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── bg.png │ │ │ │ ├── head1.png │ │ │ │ ├── head2.png │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ └── icon.png │ │ │ │ ├── layout │ │ │ │ ├── activity_anim_simple_demo.xml │ │ │ │ └── activity_main.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── tencent │ │ │ └── qgame │ │ │ └── playerproj │ │ │ └── ExampleUnitTest.kt │ ├── bintrayv1.gradle │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── installv1.gradle │ ├── publish-mavencentral.gradle │ └── settings.gradle └── README.md ├── CONTRIBUTING.md ├── Introduction.md ├── LICENSE.txt ├── MavenCentral.md ├── QGVAPlayer.podspec ├── README.md ├── README_en.md ├── iOS ├── .gitignore ├── CHANGELOG.md ├── QGVAPlayer │ ├── QGVAPlayer.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ ├── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── xcuserdata │ │ │ │ └── chanceguo.xcuserdatad │ │ │ │ └── UserInterfaceState.xcuserstate │ │ └── xcuserdata │ │ │ └── chanceguo.xcuserdatad │ │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ ├── QGVAPlayer │ │ ├── Classes │ │ │ ├── Controllers │ │ │ │ ├── Decoders │ │ │ │ │ ├── QGBaseDecoder.h │ │ │ │ │ ├── QGBaseDecoder.m │ │ │ │ │ ├── QGMP4FrameHWDecoder.h │ │ │ │ │ └── QGMP4FrameHWDecoder.m │ │ │ │ ├── QGAnimatedImageBufferManager.h │ │ │ │ ├── QGAnimatedImageBufferManager.m │ │ │ │ ├── QGAnimatedImageDecodeConfig.h │ │ │ │ ├── QGAnimatedImageDecodeConfig.m │ │ │ │ ├── QGAnimatedImageDecodeManager.h │ │ │ │ ├── QGAnimatedImageDecodeManager.m │ │ │ │ ├── QGAnimatedImageDecodeThread.h │ │ │ │ ├── QGAnimatedImageDecodeThread.m │ │ │ │ ├── QGAnimatedImageDecodeThreadPool.h │ │ │ │ ├── QGAnimatedImageDecodeThreadPool.m │ │ │ │ ├── QGVAPConfigManager.h │ │ │ │ └── QGVAPConfigManager.m │ │ │ ├── MP4Parser │ │ │ │ ├── QGMP4Box.h │ │ │ │ ├── QGMP4Box.m │ │ │ │ ├── QGMP4Parser.h │ │ │ │ └── QGMP4Parser.m │ │ │ ├── Models │ │ │ │ ├── QGBaseAnimatedImageFrame+Displaying.h │ │ │ │ ├── QGBaseAnimatedImageFrame+Displaying.m │ │ │ │ ├── QGBaseAnimatedImageFrame.h │ │ │ │ ├── QGBaseAnimatedImageFrame.m │ │ │ │ ├── QGBaseDFileInfo.h │ │ │ │ ├── QGBaseDFileInfo.m │ │ │ │ ├── QGMP4AnimatedImageFrame.h │ │ │ │ ├── QGMP4AnimatedImageFrame.m │ │ │ │ ├── QGMP4HWDFileInfo.h │ │ │ │ ├── QGMP4HWDFileInfo.m │ │ │ │ ├── QGVAPConfigModel.h │ │ │ │ ├── QGVAPConfigModel.m │ │ │ │ ├── QGVAPMaskInfo.h │ │ │ │ ├── QGVAPMaskInfo.m │ │ │ │ ├── QGVAPTextureLoader.h │ │ │ │ └── QGVAPTextureLoader.m │ │ │ ├── QGVAPWrapView.h │ │ │ ├── QGVAPWrapView.m │ │ │ ├── QGVAPlayer.h │ │ │ ├── UIView+VAP.h │ │ │ ├── UIView+VAP.m │ │ │ ├── Utils │ │ │ │ ├── Categorys │ │ │ │ │ ├── NSArray+VAPUtil.h │ │ │ │ │ ├── NSArray+VAPUtil.m │ │ │ │ │ ├── NSDictionary+VAPUtil.h │ │ │ │ │ ├── NSDictionary+VAPUtil.m │ │ │ │ │ ├── NSNotificationCenter+VAPThreadSafe.h │ │ │ │ │ ├── NSNotificationCenter+VAPThreadSafe.m │ │ │ │ │ ├── UIColor+VAPUtil.h │ │ │ │ │ ├── UIColor+VAPUtil.m │ │ │ │ │ ├── UIDevice+VAPUtil.h │ │ │ │ │ ├── UIDevice+VAPUtil.m │ │ │ │ │ ├── UIGestureRecognizer+VAPUtil.h │ │ │ │ │ ├── UIGestureRecognizer+VAPUtil.m │ │ │ │ │ ├── UIView+MP4HWDecode.h │ │ │ │ │ └── UIView+MP4HWDecode.m │ │ │ │ ├── Logger │ │ │ │ │ ├── QGVAPLogger.h │ │ │ │ │ └── QGVAPLogger.m │ │ │ │ ├── QGVAPMetalShaderFunctionLoader.h │ │ │ │ ├── QGVAPMetalShaderFunctionLoader.m │ │ │ │ ├── QGVAPMetalUtil.h │ │ │ │ ├── QGVAPMetalUtil.m │ │ │ │ ├── QGVAPSafeMutableArray.h │ │ │ │ ├── QGVAPSafeMutableArray.m │ │ │ │ ├── QGVAPSafeMutableDictionary.h │ │ │ │ ├── QGVAPSafeMutableDictionary.m │ │ │ │ ├── QGVAPWeakProxy.h │ │ │ │ └── QGVAPWeakProxy.m │ │ │ ├── VAPMacros.h │ │ │ └── Views │ │ │ │ ├── Metal │ │ │ │ ├── QGHWDMetalRenderer.h │ │ │ │ ├── QGHWDMetalRenderer.m │ │ │ │ ├── QGHWDMetalView.h │ │ │ │ ├── QGHWDMetalView.m │ │ │ │ └── Vapx │ │ │ │ │ ├── QGVAPMetalRenderer.h │ │ │ │ │ ├── QGVAPMetalRenderer.m │ │ │ │ │ ├── QGVAPMetalView.h │ │ │ │ │ └── QGVAPMetalView.m │ │ │ │ └── OpenGL │ │ │ │ ├── QGHWDMP4OpenGLView.h │ │ │ │ └── QGHWDMP4OpenGLView.m │ │ ├── Info.plist │ │ └── Shaders │ │ │ ├── QGHWDMetalShaderSourceDefine.h │ │ │ ├── QGHWDShaderTypes.h │ │ │ └── QGHWDShaders.metal │ └── QGVAPlayerTests │ │ ├── Info.plist │ │ └── QGVAPlayerTests.m ├── QGVAPlayerDemo │ ├── QGVAPlayerDemo.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ ├── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── xcuserdata │ │ │ │ └── chanceguo.xcuserdatad │ │ │ │ ├── IDEFindNavigatorScopes.plist │ │ │ │ └── UserInterfaceState.xcuserstate │ │ └── xcuserdata │ │ │ └── chanceguo.xcuserdatad │ │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ ├── QGVAPlayerDemo │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Assets.xcassets │ │ │ ├── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Base.lproj │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ ├── Info.plist │ │ ├── ViewController.h │ │ ├── ViewController.m │ │ └── main.m │ ├── QGVAPlayerDemoTests │ │ ├── Info.plist │ │ └── QGVAPlayerDemoTests.m │ ├── QGVAPlayerDemoUITests │ │ ├── Info.plist │ │ └── QGVAPlayerDemoUITests.m │ └── Resource │ │ ├── demo.mp4 │ │ ├── qq.png │ │ └── vap.mp4 ├── QGVAPlayerDemoSwift │ ├── QGVAPlayerDemoSwift.xcodeproj │ │ ├── project.pbxproj │ │ └── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── QGVAPlayerDemoSwift │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── Info.plist │ │ ├── QGVAPlayer-Bridging-Header.h │ │ ├── SceneDelegate.swift │ │ └── ViewController.swift └── README.md ├── images ├── anim1.gif ├── anim2.gif ├── anim3.gif ├── anim4.gif ├── anim5.gif ├── icons.png ├── pic1.png ├── pic2.png ├── pic3.png ├── pic4.png └── pic5.png ├── tool ├── JsonDesc.md ├── Mac_Tool.md ├── README.md ├── README_en.md ├── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── vap_field_info.png │ ├── vaptool_java_01.png │ └── vaptool_java_02.png ├── simple_demo │ ├── 000.png │ ├── 001.png │ ├── 002.png │ ├── 003.png │ ├── 004.png │ ├── 005.png │ ├── 006.png │ ├── 007.png │ ├── 008.png │ ├── 009.png │ ├── 010.png │ ├── 011.png │ ├── 012.png │ ├── 013.png │ ├── 014.png │ ├── 015.png │ ├── 016.png │ ├── 017.png │ ├── 018.png │ ├── 019.png │ ├── 020.png │ ├── 021.png │ ├── 022.png │ ├── 023.png │ ├── 024.png │ ├── 025.png │ ├── 026.png │ ├── 027.png │ ├── 028.png │ ├── 029.png │ ├── 030.png │ ├── 031.png │ ├── 032.png │ ├── 033.png │ ├── 034.png │ ├── 035.png │ ├── 036.png │ ├── 037.png │ ├── 038.png │ ├── 039.png │ ├── 040.png │ ├── 041.png │ ├── 042.png │ ├── 043.png │ ├── 044.png │ ├── 045.png │ ├── 046.png │ ├── 047.png │ ├── 048.png │ ├── 049.png │ ├── 050.png │ ├── 051.png │ ├── 052.png │ ├── 053.png │ ├── 054.png │ ├── 055.png │ ├── 056.png │ ├── 057.png │ ├── 058.png │ ├── 059.png │ ├── 060.png │ ├── 061.png │ ├── 062.png │ ├── 063.png │ ├── 064.png │ ├── 065.png │ ├── 066.png │ ├── 067.png │ ├── 068.png │ ├── 069.png │ ├── 070.png │ ├── 071.png │ ├── 072.png │ ├── 073.png │ ├── 074.png │ ├── 075.png │ ├── 076.png │ ├── 077.png │ ├── 078.png │ └── 079.png ├── vapxTool │ ├── VapxTool.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── VapxTool.xcscheme │ ├── VapxTool │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Assets.xcassets │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ └── icons8-idea-64.png │ │ │ ├── Contents.json │ │ │ ├── addMergeInfo.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── add.png │ │ │ └── close.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── close.png │ │ ├── Base.lproj │ │ │ └── Main.storyboard │ │ ├── Draft_License_VAP_HK20200804.txt │ │ ├── Info.plist │ │ ├── Utils │ │ │ ├── NSArray+HWDUtil.h │ │ │ ├── NSArray+HWDUtil.m │ │ │ ├── NSDictionary+HWDUtil.h │ │ │ └── NSDictionary+HWDUtil.m │ │ ├── VapxTool.entitlements │ │ ├── ViewController.h │ │ ├── ViewController.m │ │ ├── controllers │ │ │ ├── VapxAlphaExtractor.h │ │ │ ├── VapxAlphaExtractor.m │ │ │ ├── VapxFileHelper.h │ │ │ ├── VapxFileHelper.m │ │ │ ├── VapxLayoutManager.h │ │ │ ├── VapxLayoutManager.m │ │ │ ├── VapxMP4Decoder.h │ │ │ ├── VapxMP4Decoder.m │ │ │ ├── VapxMaskInfoGenerator.h │ │ │ ├── VapxMaskInfoGenerator.m │ │ │ ├── VapxMp4Editor.h │ │ │ ├── VapxMp4Editor.m │ │ │ ├── VapxProcessor.h │ │ │ └── VapxProcessor.m │ │ ├── main.m │ │ ├── models │ │ │ ├── QGVAPConfigModel.h │ │ │ └── QGVAPConfigModel.m │ │ └── views │ │ │ ├── VapMergeInfoView.h │ │ │ ├── VapMergeInfoView.m │ │ │ ├── VapProgressHUD.h │ │ │ └── VapProgressHUD.m │ ├── VapxToolTests │ │ ├── Info.plist │ │ └── VapxToolTests.m │ ├── VapxToolUITests │ │ ├── Info.plist │ │ └── VapxToolUITests.m │ └── frameworks │ │ ├── Bento4-SDK-1-5-1-628 │ │ └── bin │ │ │ ├── aac2mp4 │ │ │ ├── libBento4C.dylib │ │ │ ├── mp42aac │ │ │ ├── mp42avc │ │ │ ├── mp42hevc │ │ │ ├── mp42hls │ │ │ ├── mp42ts │ │ │ ├── mp4compact │ │ │ ├── mp4dash │ │ │ ├── mp4dashclone │ │ │ ├── mp4dcfpackager │ │ │ ├── mp4decrypt │ │ │ ├── mp4dump │ │ │ ├── mp4edit │ │ │ ├── mp4encrypt │ │ │ ├── mp4extract │ │ │ ├── mp4fragment │ │ │ ├── mp4hls │ │ │ ├── mp4iframeindex │ │ │ ├── mp4info │ │ │ ├── mp4mux │ │ │ ├── mp4rtphintinfo │ │ │ ├── mp4split │ │ │ └── mp4tag │ │ └── ffmpeg └── vapx_demo │ ├── mask │ └── name │ │ ├── 000.png │ │ ├── 001.png │ │ ├── 002.png │ │ ├── 003.png │ │ ├── 004.png │ │ ├── 005.png │ │ ├── 006.png │ │ ├── 007.png │ │ ├── 008.png │ │ ├── 009.png │ │ ├── 010.png │ │ ├── 011.png │ │ ├── 012.png │ │ ├── 013.png │ │ ├── 014.png │ │ ├── 015.png │ │ ├── 016.png │ │ ├── 017.png │ │ ├── 018.png │ │ ├── 019.png │ │ ├── 020.png │ │ ├── 021.png │ │ ├── 022.png │ │ ├── 023.png │ │ ├── 024.png │ │ ├── 025.png │ │ ├── 026.png │ │ ├── 027.png │ │ ├── 028.png │ │ ├── 029.png │ │ ├── 030.png │ │ ├── 031.png │ │ ├── 032.png │ │ ├── 033.png │ │ ├── 034.png │ │ ├── 035.png │ │ ├── 036.png │ │ ├── 037.png │ │ ├── 038.png │ │ ├── 039.png │ │ ├── 040.png │ │ ├── 041.png │ │ ├── 042.png │ │ ├── 043.png │ │ ├── 044.png │ │ ├── 045.png │ │ ├── 046.png │ │ ├── 047.png │ │ ├── 048.png │ │ ├── 049.png │ │ ├── 050.png │ │ ├── 051.png │ │ ├── 052.png │ │ ├── 053.png │ │ ├── 054.png │ │ ├── 055.png │ │ ├── 056.png │ │ ├── 057.png │ │ ├── 058.png │ │ ├── 059.png │ │ ├── 060.png │ │ ├── 061.png │ │ ├── 062.png │ │ ├── 063.png │ │ ├── 064.png │ │ ├── 065.png │ │ ├── 066.png │ │ ├── 067.png │ │ ├── 068.png │ │ ├── 069.png │ │ ├── 070.png │ │ ├── 071.png │ │ ├── 072.png │ │ ├── 073.png │ │ ├── 074.png │ │ ├── 075.png │ │ ├── 076.png │ │ ├── 077.png │ │ ├── 078.png │ │ ├── 079.png │ │ ├── 080.png │ │ ├── 081.png │ │ ├── 082.png │ │ ├── 083.png │ │ ├── 084.png │ │ ├── 085.png │ │ ├── 086.png │ │ ├── 087.png │ │ ├── 088.png │ │ ├── 089.png │ │ ├── 090.png │ │ ├── 091.png │ │ ├── 092.png │ │ ├── 093.png │ │ ├── 094.png │ │ ├── 095.png │ │ ├── 096.png │ │ ├── 097.png │ │ ├── 098.png │ │ ├── 099.png │ │ ├── 100.png │ │ ├── 101.png │ │ ├── 102.png │ │ ├── 103.png │ │ ├── 104.png │ │ ├── 105.png │ │ ├── 106.png │ │ ├── 107.png │ │ ├── 108.png │ │ ├── 109.png │ │ ├── 110.png │ │ ├── 111.png │ │ ├── 112.png │ │ ├── 113.png │ │ ├── 114.png │ │ ├── 115.png │ │ ├── 116.png │ │ ├── 117.png │ │ ├── 118.png │ │ └── 119.png │ └── png │ ├── 000.png │ ├── 001.png │ ├── 002.png │ ├── 003.png │ ├── 004.png │ ├── 005.png │ ├── 006.png │ ├── 007.png │ ├── 008.png │ ├── 009.png │ ├── 010.png │ ├── 011.png │ ├── 012.png │ ├── 013.png │ ├── 014.png │ ├── 015.png │ ├── 016.png │ ├── 017.png │ ├── 018.png │ ├── 019.png │ ├── 020.png │ ├── 021.png │ ├── 022.png │ ├── 023.png │ ├── 024.png │ ├── 025.png │ ├── 026.png │ ├── 027.png │ ├── 028.png │ ├── 029.png │ ├── 030.png │ ├── 031.png │ ├── 032.png │ ├── 033.png │ ├── 034.png │ ├── 035.png │ ├── 036.png │ ├── 037.png │ ├── 038.png │ ├── 039.png │ ├── 040.png │ ├── 041.png │ ├── 042.png │ ├── 043.png │ ├── 044.png │ ├── 045.png │ ├── 046.png │ ├── 047.png │ ├── 048.png │ ├── 049.png │ ├── 050.png │ ├── 051.png │ ├── 052.png │ ├── 053.png │ ├── 054.png │ ├── 055.png │ ├── 056.png │ ├── 057.png │ ├── 058.png │ ├── 059.png │ ├── 060.png │ ├── 061.png │ ├── 062.png │ ├── 063.png │ ├── 064.png │ ├── 065.png │ ├── 066.png │ ├── 067.png │ ├── 068.png │ ├── 069.png │ ├── 070.png │ ├── 071.png │ ├── 072.png │ ├── 073.png │ ├── 074.png │ ├── 075.png │ ├── 076.png │ ├── 077.png │ ├── 078.png │ ├── 079.png │ ├── 080.png │ ├── 081.png │ ├── 082.png │ ├── 083.png │ ├── 084.png │ ├── 085.png │ ├── 086.png │ ├── 087.png │ ├── 088.png │ ├── 089.png │ ├── 090.png │ ├── 091.png │ ├── 092.png │ ├── 093.png │ ├── 094.png │ ├── 095.png │ ├── 096.png │ ├── 097.png │ ├── 098.png │ ├── 099.png │ ├── 100.png │ ├── 101.png │ ├── 102.png │ ├── 103.png │ ├── 104.png │ ├── 105.png │ ├── 106.png │ ├── 107.png │ ├── 108.png │ ├── 109.png │ ├── 110.png │ ├── 111.png │ ├── 112.png │ ├── 113.png │ ├── 114.png │ ├── 115.png │ ├── 116.png │ ├── 117.png │ ├── 118.png │ └── 119.png └── web ├── .babelrc ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .prettierrc ├── README.md ├── demo ├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── logo.png │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── config │ ├── dev.env.js │ ├── index.js │ └── prod.env.js ├── index.html ├── package-lock.json ├── package.json ├── src │ ├── App.vue │ ├── assets │ │ └── logo.png │ ├── components │ │ ├── HelloWorld.vue │ │ ├── demo.json │ │ └── demo.mp4 │ ├── main.js │ └── router │ │ └── index.js └── static │ └── .gitkeep ├── dist ├── gl-util.d.ts ├── index.d.ts ├── type.d.ts ├── vap-frame-parser.d.ts ├── vap.js ├── vap.min.js ├── video.d.ts └── webgl-render-vap.d.ts ├── package-lock.json ├── package.json ├── rollup.config.dist.js ├── rollup.config.js ├── rollup.tsconfig.json ├── src ├── gl-util.ts ├── index.ts ├── type.ts ├── vap-frame-parser.ts ├── video.ts └── webgl-render-vap.ts └── tsconfig.json /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | # issue 模版 11 | 12 | 1. 问题描述(重现路径) 13 | 2. 运行环境(手机型号,Android/iOS版本等) 14 | 3. 相关日志 15 | 4. 播放错误的文件(可选) 16 | 17 | # issue template 18 | 19 | 1. Problem description 20 | 2. Running environment (mobile phone model, Android/iOS version, etc.) 21 | 3. Logs 22 | 4. Error file (optional) 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | node_modules 3 | # logs 4 | npm-debug.log 5 | 6 | # Nuxt generate 7 | .vscode 8 | 9 | .idea 10 | 11 | # sw.* 12 | 13 | .cache 14 | 15 | #mac cache 16 | .DS_Store 17 | -------------------------------------------------------------------------------- /Android/PlayerProj/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches/build_file_checksums.ser 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | .idea 9 | .DS_Store 10 | /build 11 | /captures 12 | .externalNativeBuild 13 | gradle.properties -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | 5 | android { 6 | compileSdkVersion 28 7 | 8 | defaultConfig { 9 | minSdkVersion 16 10 | targetSdkVersion 28 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | 22 | } 23 | 24 | dependencies { 25 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version") { 26 | exclude module: 'annotations' 27 | } 28 | } 29 | 30 | // jcenter 上传(这个要在底部) 31 | // 上传需要执行此任务 IDE -> gradle-> Tasks/publishing/bintrayUpload 32 | // apply from: file("publish.gradle") 33 | 34 | 35 | // maven central 36 | // 上传指令./gradlew uploadArchives 37 | // https://s01.oss.sonatype.org/ 38 | // Staging Repositories -> close -> release 39 | // apply from: "../publish-mavencentral.gradle" 40 | -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/publish.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | // 此处填写刚才建立的maven仓库的仓库名称 3 | bintrayRepo = 'maven' 4 | // library的group id 5 | publishedGroupId = 'com.egame.vap' 6 | // library网站地址 7 | siteUrl = 'https://github.com/Tencent/vap' 8 | // library仓库地址 9 | gitUrl = 'https://github.com/Tencent/vap' 10 | 11 | // 注册时候的bintray username 12 | developerId = 'hexleo' 13 | // 开发者名称 14 | developerName = 'hexleo' 15 | // 开发者邮箱 16 | developerEmail = 'wanghailiang333@gmail.com' 17 | 18 | // 开源许可证 19 | licenseName = 'MIT' 20 | licenseUrl = 'http://opensource.org/licenses/MIT' 21 | allLicenses = ["MIT"] 22 | 23 | // library artifact(单个module一般就填写library name) 24 | artifact = 'animplayer' 25 | libraryName = 'animplayer' 26 | libraryVersion = '2.0.15' 27 | libraryDescription = '' 28 | // bintrayName 是你在网页Repository页面能看到的名称 29 | bintrayName = 'vap' 30 | } 31 | 32 | apply from: '../installv1.gradle' 33 | apply from: '../bintrayv1.gradle' 34 | -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/file/IFileContainer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Tencent is pleased to support the open source community by making vap available. 3 | * 4 | * Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved. 5 | * 6 | * Licensed under the MIT License (the "License"); you may not use this file except in 7 | * compliance with the License. You may obtain a copy of the License at 8 | * 9 | * http://opensource.org/licenses/MIT 10 | * 11 | * Unless required by applicable law or agreed to in writing, software distributed under the License is 12 | * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 13 | * either express or implied. See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.tencent.qgame.animplayer.file 17 | 18 | import android.media.MediaExtractor 19 | 20 | interface IFileContainer { 21 | 22 | fun setDataSource(extractor: MediaExtractor) 23 | 24 | fun startRandomRead() 25 | 26 | fun read(b: ByteArray, off: Int, len: Int): Int 27 | 28 | fun skip(pos: Long) 29 | 30 | fun closeRandomRead() 31 | 32 | fun close() 33 | 34 | } -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/inter/IFetchResource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Tencent is pleased to support the open source community by making vap available. 3 | * 4 | * Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved. 5 | * 6 | * Licensed under the MIT License (the "License"); you may not use this file except in 7 | * compliance with the License. You may obtain a copy of the License at 8 | * 9 | * http://opensource.org/licenses/MIT 10 | * 11 | * Unless required by applicable law or agreed to in writing, software distributed under the License is 12 | * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 13 | * either express or implied. See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.tencent.qgame.animplayer.inter 17 | 18 | import android.graphics.Bitmap 19 | import com.tencent.qgame.animplayer.mix.Resource 20 | 21 | /** 22 | * 获取资源 23 | */ 24 | interface IFetchResource { 25 | // 获取图片 (暂时不支持Bitmap.Config.ALPHA_8 主要是因为一些机型opengl兼容问题) 26 | fun fetchImage(resource: Resource, result:(Bitmap?) -> Unit) 27 | 28 | // 获取文字 29 | fun fetchText(resource: Resource, result:(String?) -> Unit) 30 | 31 | // 资源释放通知 32 | fun releaseResource(resources: List) 33 | } -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/inter/OnResourceClickListener.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Tencent is pleased to support the open source community by making vap available. 3 | * 4 | * Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved. 5 | * 6 | * Licensed under the MIT License (the "License"); you may not use this file except in 7 | * compliance with the License. You may obtain a copy of the License at 8 | * 9 | * http://opensource.org/licenses/MIT 10 | * 11 | * Unless required by applicable law or agreed to in writing, software distributed under the License is 12 | * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 13 | * either express or implied. See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.tencent.qgame.animplayer.inter 17 | 18 | import com.tencent.qgame.animplayer.mix.Resource 19 | 20 | interface OnResourceClickListener { 21 | 22 | // 返回被点击的资源 23 | fun onClick(resource: Resource) 24 | } -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/mix/Resource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Tencent is pleased to support the open source community by making vap available. 3 | * 4 | * Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved. 5 | * 6 | * Licensed under the MIT License (the "License"); you may not use this file except in 7 | * compliance with the License. You may obtain a copy of the License at 8 | * 9 | * http://opensource.org/licenses/MIT 10 | * 11 | * Unless required by applicable law or agreed to in writing, software distributed under the License is 12 | * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 13 | * either express or implied. See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.tencent.qgame.animplayer.mix 17 | 18 | import android.graphics.Bitmap 19 | import com.tencent.qgame.animplayer.PointRect 20 | 21 | /** 22 | * 资源描述 23 | */ 24 | class Resource(src: Src) { 25 | var id = "" 26 | var type = Src.SrcType.UNKNOWN 27 | var loadType = Src.LoadType.UNKNOWN 28 | var tag = "" 29 | var bitmap: Bitmap? = null 30 | var curPoint: PointRect? = null // src在当前帧的位置信息 31 | 32 | init { 33 | id = src.srcId 34 | type = src.srcType 35 | loadType = src.loadType 36 | tag = src.srcTag 37 | bitmap = src.bitmap 38 | } 39 | } -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/textureview/InnerTextureView.kt: -------------------------------------------------------------------------------- 1 | package com.tencent.qgame.animplayer.textureview 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.MotionEvent 6 | import android.view.TextureView 7 | import com.tencent.qgame.animplayer.AnimPlayer 8 | 9 | class InnerTextureView @JvmOverloads constructor( 10 | context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 11 | ) : TextureView(context, attrs, defStyleAttr) { 12 | 13 | var player: AnimPlayer? = null 14 | 15 | override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { 16 | val res = player?.isRunning() == true 17 | && ev != null 18 | && player?.pluginManager?.onDispatchTouchEvent(ev) == true 19 | return if (!res) super.dispatchTouchEvent(ev) else true 20 | } 21 | } -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | animplayer 3 | 4 | -------------------------------------------------------------------------------- /Android/PlayerProj/animplayer/src/test/java/com/tencent/qgame/animplayer/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.tencent.qgame.animplayer; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /Android/PlayerProj/animtool/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /Android/PlayerProj/animtool/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java-library' 2 | 3 | dependencies { 4 | implementation fileTree(dir: 'libs', include: ['*.jar']) 5 | } 6 | 7 | sourceCompatibility = "7" 8 | targetCompatibility = "7" 9 | buildscript { 10 | repositories { 11 | mavenCentral() 12 | } 13 | dependencies { 14 | } 15 | } 16 | repositories { 17 | mavenCentral() 18 | } 19 | 20 | jar { 21 | manifest { 22 | attributes( 23 | 'Main-Class': 'com.tencent.qgame.playerproj.animtool.Main' 24 | ) 25 | } 26 | } -------------------------------------------------------------------------------- /Android/PlayerProj/animtool/src/main/java/com/tencent/qgame/playerproj/animtool/data/PointRect.java: -------------------------------------------------------------------------------- 1 | package com.tencent.qgame.playerproj.animtool.data; 2 | 3 | public class PointRect { 4 | 5 | public int x = 0; 6 | public int y = 0; 7 | public int w = 0; 8 | public int h = 0; 9 | 10 | public PointRect() { 11 | } 12 | 13 | public PointRect(int x, int y, int w, int h) { 14 | this.x = x; 15 | this.y = y; 16 | this.w = w; 17 | this.h = h; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return "["+ x +","+ y +","+ w +","+ h +"]"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Android/PlayerProj/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /Android/PlayerProj/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | apply plugin: 'kotlin-android' 4 | apply plugin: 'kotlin-android-extensions' 5 | 6 | android { 7 | compileSdkVersion 28 8 | defaultConfig { 9 | applicationId "com.tencent.qgame.playerproj" 10 | minSdkVersion 16 11 | targetSdkVersion 28 12 | versionCode 1 13 | versionName "1.0" 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | lintOptions { 22 | abortOnError false 23 | } 24 | } 25 | 26 | dependencies { 27 | implementation fileTree(dir: 'libs', include: ['*.jar']) 28 | implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 29 | implementation project(":animplayer") 30 | } 31 | -------------------------------------------------------------------------------- /Android/PlayerProj/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/assets/demo.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tencent/vap/58da07ec5a24ec8bdd6bd3a40b413970065607a5/Android/PlayerProj/app/src/main/assets/demo.mp4 -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/assets/mask_blur_demo.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tencent/vap/58da07ec5a24ec8bdd6bd3a40b413970065607a5/Android/PlayerProj/app/src/main/assets/mask_blur_demo.mp4 -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/assets/mask_trunk_demo.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tencent/vap/58da07ec5a24ec8bdd6bd3a40b413970065607a5/Android/PlayerProj/app/src/main/assets/mask_trunk_demo.mp4 -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/assets/special_size_750.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tencent/vap/58da07ec5a24ec8bdd6bd3a40b413970065607a5/Android/PlayerProj/app/src/main/assets/special_size_750.mp4 -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/assets/vapx.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tencent/vap/58da07ec5a24ec8bdd6bd3a40b413970065607a5/Android/PlayerProj/app/src/main/assets/vapx.mp4 -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/res/drawable/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tencent/vap/58da07ec5a24ec8bdd6bd3a40b413970065607a5/Android/PlayerProj/app/src/main/res/drawable/bg.png -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/res/drawable/head1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tencent/vap/58da07ec5a24ec8bdd6bd3a40b413970065607a5/Android/PlayerProj/app/src/main/res/drawable/head1.png -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/res/drawable/head2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tencent/vap/58da07ec5a24ec8bdd6bd3a40b413970065607a5/Android/PlayerProj/app/src/main/res/drawable/head2.png -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/res/drawable/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tencent/vap/58da07ec5a24ec8bdd6bd3a40b413970065607a5/Android/PlayerProj/app/src/main/res/drawable/icon.png -------------------------------------------------------------------------------- /Android/PlayerProj/app/src/main/res/layout/activity_anim_simple_demo.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 17 |