为了账号安全,请及时绑定邮箱和手机立即绑定

单个LottieAnimationView加载不同的lottie动画

标签:
Android

需求

最近做了一个单个LottieAnimationView根据用户点击选项的不同,加载不同的lottie动画的需求。踩了一些坑,比如lottie动画只能播放第一个,后面的就不放了,比如第二个lottie动画播放时会闪一下第一个lottie动画画面,比如播放混乱,明明点击的是第一个动画,播放的确实第二个等等。特此把最后的使用总结如下。最后的效果因为涉及内部内容就不放了。

加载sdcard的lottie动画

 /**
     * 播放sdcard的动画
     * @param jsonFile  json文件
     * @param imagesDir json文件引用的image文件的目录
     * @throws Exception
     */
    private void  showSdcardLottieEffects(File jsonFile,File imagesDir) throws Exception{
        BufferedReader bufferedReader = new BufferedReader(new FileReader(jsonFile));
        String content = null;
        StringBuilder stringBuilder = new StringBuilder();        while ((content = bufferedReader.readLine()) != null){
            stringBuilder.append(content);
        }

        JSONObject jsonObject = new JSONObject(stringBuilder.toString());        final String absolutePath = imagesDir.getAbsolutePath();        //提供一个代理接口从 SD 卡读取 images 下的图片
        specialEffectLottieAnim.setImageAssetDelegate(new ImageAssetDelegate() {            @Override
            public Bitmap fetchBitmap(LottieImageAsset asset) {
                Bitmap bitmap = null;
                FileInputStream fileInputStream = null;                try {
                    fileInputStream = new FileInputStream(absolutePath + File.separator + asset.getFileName());
                    bitmap = BitmapFactory.decodeStream(fileInputStream);
                }catch (Exception e){
                    e.printStackTrace();
                }finally {                    try {                        if (bitmap == null) {
                            bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8);
                        }                        if (fileInputStream != null) {
                            fileInputStream.close();
                        }
                    } catch (IOException e) {
                        LogUtil.e(TAG, e);
                    }
                }                return bitmap;
            }
        });

        LottieComposition.Factory.fromJson(getResources(), jsonObject, new OnCompositionLoadedListener() {            @Override
            public void onCompositionLoaded(@Nullable LottieComposition composition) {                if(composition == null){                    return;
                }
                specialEffectLottieAnim.cancelAnimation();
                specialEffectLottieAnim.setProgress(0);
                specialEffectLottieAnim.setComposition(composition);
                specialEffectLottieAnim.playAnimation();
                specialEffectLottieAnim.setVisibility(View.VISIBLE);
            }
        });

    }

加载应用内部assets目录下的lottie文件

/**
     * 从本地查找lottie动画
     * @param interactCode 特效name
     */
    private void showLocalLottieEffects(String interactCode){
        LogUtil.i(TAG, "启动本地动画 folderIsWatch:"+ folderIsWatch+ " interactCode:"+interactCode);        try{        //json文件的路径根据具体需求修改
            LottieComposition composition = LottieComposition.Factory.fromFileSync(this, "lottie/" +interactCode+".json");
            specialEffectLottieAnim.cancelAnimation();
            specialEffectLottieAnim.setProgress(0);
            specialEffectLottieAnim.setComposition(composition);
            specialEffectLottieAnim.playAnimation();
            specialEffectLottieAnim.setVisibility(View.VISIBLE);
        }catch (Exception e){
            LogUtil.i(TAG, "启动本地动画 "+"  interactCode:"+interactCode+"出错",e);
        }
    }



作者:BrainZou
链接:https://www.jianshu.com/p/ace73be670b9


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消