欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-03 10:36:45
...

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;
    }

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

祝好运~