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;
}
至此已经演示完毕,代码其实都挺简单的,照着来就行,需要替换的内容可根据你的需求来定,我这边也只是一个演示哦~
祝好运~
上一篇: 属性动画简单使用
下一篇: 安卓动画学习(五)--组合属性动画