Android开发——SVGA格式动画内容资源替换

Android开发——SVGA格式动画内容资源替换

随着接触的项目类型越来越多,目前格式个样的炫酷动画也随之而来,既然原生动画实现起来复杂,且有一个快捷灵活的动画为何不用呢,那让我们来好好学习一下如何使用svga吧~svga是什么如果想要了解的可以去查一查,本篇就不做讲解了,只能说它是可以显示动画格式的一种资源~

如何使用呢,必然我们作为一个开发人员,既然是个库我们就得去依赖它,你细品~

集成指南(其中可以直接加载你的资源来供你观摩哦)了解一下:http://svga.io/integrated.html

既然已经知道怎么集成了,那我们使用起来吧,在下只能演示我的使用规则了,哈哈哈

1、首先使用本地资源加载代码走一波(片段代码):

/**
     * 本地资源svga动画播放
     *
     * @param svgaImageView
     * @param cacheKey
     * @param fileName
     */
    public static void startLocalAnim(Context context, SVGAImageView svgaImageView, String cacheKey, String fileName) {
        try {
            InputStream open = context.getAssets().open(fileName);
            SVGAParser svgaParser = new SVGAParser(context);
            svgaParser.decodeFromInputStream(open, cacheKey, new SVGAParser.ParseCompletion() {
                @Override
                public void onComplete(@NotNull SVGAVideoEntity svgaVideoEntity) {
                    if (svgaImageView != null) {
                        SVGADrawable drawable = new SVGADrawable(svgaVideoEntity);
                        svgaImageView.setImageDrawable(drawable);
                        svgaImageView.startAnimation();
                    }
                }

                @Override
                public void onError() {
                }
            }, true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

我这是放在assets目录下的资源,如果是下载好在内存里面的直接加载内存里面的也可以

2、既然本地都用了,网路也得跟着来啊~

/**
     * 网络资源播放
     *
     * @param url
     * @param svgaImageView
     * @param close
     */
    protected void startNetAnim(String url, SVGAImageView svgaImageView) {
        try {
            svgaParser.decodeFromURL(new URL(url), new SVGAParser.ParseCompletion() {

                @Override
                public void onComplete(SVGAVideoEntity videoItem) {
                    if (svgaImageView != null) {
                        svgaImageView.setVisibility(View.VISIBLE);
                        SVGADrawable drawable = new SVGADrawable(videoItem);
                        svgaImageView.setImageDrawable(drawable);
                        svgaImageView.startAnimation();
                    }
                }

                @Override
                public void onError() {
                    animFinishCallback();
                }
            });
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

是不是很简单,其实呢如果资源太大还是建议先将文件下载到本地,使用本地播放的这样也不会因为网速和大小影响渲染效果

3、既然加载都会了,那就该来说说如何适当的替换里面定义好需要修改的内容了,代码接着走起

这里演示的是我项目里面使用到的替换两个头像和两个昵称:

public static void playCPAnimSVGA(Activity context, String name1, String name2, String url, String url2, SVGAVideoEntity videoItem, SVGAImageView animationView) {
        SVGADynamicEntity dynamicEntity = new SVGADynamicEntity();
        new Thread() {
            public void run() {
                Bitmap bitmap = getBitmap(context, url, 174, 174, 87);
                Bitmap bitmap2 = getBitmap(context, url2, 174, 174, 87);
                animationView.post(new Runnable() {
                    @Override
                    public void run() {
                        //设置图片 res:Bitmap
                        //nantx、nvtx:是个站位符号
                        dynamicEntity.setDynamicImage(bitmap, "nantx"); // Here is the KEY implementation.
                        dynamicEntity.setDynamicImage(bitmap2, "nvtx"); // Here is the KEY implementation.
                        //设置文字
                        TextPaint textPaint = new TextPaint();
                        textPaint.setColor(0xFFFD5A90);
                        textPaint.setTextSize(24);
                        //nannc、nvnc:是个站位符号
                        dynamicEntity.setDynamicText(name1, textPaint, "nannc");
                        dynamicEntity.setDynamicText(name2, textPaint, "nvnc");
                        //播放动画
                        context.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                SVGADrawable drawable = new SVGADrawable(videoItem, dynamicEntity);
                                animationView.setImageDrawable(drawable);
                                animationView.setLoops(1);
                                animationView.startAnimation();
                            }
                        });
                    }
                });
            }
        }.start();
    }

private static Bitmap getBitmap(Context context, String url, int width, int height, int radius) {
        Bitmap myBitmap = null;
        try {
            myBitmap = Glide.with(context)
                    .asBitmap()
                    .load(url)
                    .submit(width, height).get();
            Bitmap bitmap = Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight());
            return toRoundBitmap(bitmap, width, height, radius);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return null;
    }


    public static Bitmap toRoundBitmap(Bitmap bitmap, int width, int height, int radius) {
        // 前面同上,绘制图像分别需要bitmap,canvas,paint对象
        bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
        Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bm);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        // 这里需要先画出一个圆
        canvas.drawCircle(width / 2, height / 2, radius, paint);
        // 圆画好之后将画笔重置一下
        paint.reset();
        // 设置图像合成模式,该模式为只在源图像和目标图像相交的地方绘制源图像
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, 0, 0, paint);
        return bm;
    }

至此已经演示完毕,代码其实都挺简单的,照着来就行,需要替换的内容可根据你的需求来定,我这边也只是一个演示哦~

祝好运~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值