GIF动图效果不是很好,实际效果非常平滑very smooth,而且添加不同的图形可以组成各种效果,目前已经用在我们项目的注册界面~
原理:
实现原理很简单,每一个悬浮的“小物体”就是一个自定义View,这些小的自定义View都盛放在一个自定义的ViewGroup中。然后所有的视图都放在这个ViewGroup之上,这样就相当于做一个可动的背景。
下面结合代码详细介绍下:
详解:
FloatObject
悬浮的物体,继承自View,需要重写onDraw方法,主要作用就是来画出自己,并进行随机曲线运动。
任何需要画出的对象都需要继承FloatObject,并重写提供的drawFloatObject方法,在此方法中可以通过设置画笔和画布画出任意图形。比如下面是画出一行文字:
public class FloatText extends FloatObject {
String text;
public FloatText(float posX, float posY, String text) {
super(posX, posY);
this.text = text;
setAlpha(88);
setColor(Color.WHITE);
}
@Override
public void drawFloatObject(Canvas canvas, float x, float y, Paint paint) {
paint.setTextSize(65);
canvas.drawText(text, x, y, paint);
}
}
随机曲线:
其实最复杂的部分就是让漂浮的物体做随机无规则的曲线运动,并且每个漂浮物的速度不同,这样整个漂浮动画才更加自然。
我之前想过使用布朗运动,但是在网上找了好久也没找到一个好用的算法。
最后只能还是使用3点赛贝尔曲线,使漂浮物沿着一条赛贝尔曲线运动,达到终点时,再随机产生一条新的曲线,这样就可以实现随机曲线运动了。
控制运动的代码如下:
public void drawFloatItem(Canvas canvas) {
switch (status) {
case START:
// fade in
if (isFade() && alpha <= ALPHA_LIMIT) {
paint.setAlpha(alpha);
alpha += ALPHA_PER_FRAME;
} else {
setStatus(MOVE);
}
break;
case MOVE:
// 更新赛贝尔曲线点
if (mCurDistance == 0) {
start = new PointF(x, y);
end = getRandomPoint((int)start.x, (int)start.y, (int) distance);// 取值范围distance
c1 = getRandomPoint((int)start.x, (int)start.y, random.nextInt(width / 2)); // 取值范围width/2
c2 = getRandomPoint(end.x, end.y, random.nextInt(width / 2));// 取值范围width/2
}
// 计算塞贝儿曲线的当前点
PointF bezierPoint = CalculateBezierPoint(mCurDistance / distance, start, c1, c2, end);
x = bezierPoint.x;
y = bezierPoint.y;
// 更新当前路径
mCurDistance += MOVE_PER_FRAME;
// 一段画完后重置
if (mCurDistance >= distance) {
mCurDistance = 0;
}
break;
case END:
// fade out
if (isFade() && alpha > 0) {
paint.setAlpha(alpha);
alpha -= ALPHA_PER_FRAME;
} else {
setStatus(FINISH);
}
break;
}
if (status != FINISH) {
Log.e("drawFloatObject", x+", "+y);
drawFloatObject(canvas, x ,y, paint);
}
}
关于赛贝尔曲线运动的算法都是复用之前写的一篇文章ANDROID模拟火花粒子的滑动喷射效果,如果大家有兴趣可以看看。
FloatBackground
FloatBackground继承自FrameLayout,里面有一个用于存放FloatObject的集合。
FloatBackground的主要作用就是绘制所有的“漂浮物”,以及维护其生命周期:
初始化:
private void initFloatObject(int width, int height) {
for (FloatObject floatObject : floats) {
int x = (int) (floatObject.posX * width);
int y = (int) (floatObject.posY * height);
floatObject.init(x, y, width, height);
}
}
绘制:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (FloatObject floatObject : floats) {
floatObject.drawFloatItem(canvas);
}
// 隔一段时间重绘一次, 动画效果
getHandler().postDelayed(runnable, DELAY);
}
// 重绘线程
private Runnable runnable = new Runnable() {
@Override
public void run() {
invalidate();
// 控制帧数
}
};
开始和结束:
public void startFloat() {
for (FloatObject floatObject : floats) {
floatObject.setStatus(FloatObject.START);
}
}
public void endFloat() {
for (FloatObject floatObject : floats) {
floatObject.setStatus(FloatObject.END);
}
}
使用
使用时非常简单,在layout文件中将FloatBackground设置为最底层的视图(其实就是当作一个背景):
<com.dean.library.FloatBackground android:id="@+id/float_view" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <Button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Start" /> <Button android:id="@+id/end" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="End" /> </LinearLayout> </com.dean.library.FloatBackground>
在代码中进行如下调用:
final FloatBackground floatBackground = (FloatBackground) this.findViewById(R.id.float_view);
Button start = (Button) this.findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
floatBackground.startFloat();
}
});
Button end = (Button) this.findViewById(R.id.end);
end.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
floatBackground.endFloat();
}
});
floatBackground.addFloatView(new FloatRect(0.2f, 0.3f, 30, 40));
floatBackground.addFloatView(new FloatBitmap( this, 0.2f, 0.3f, R.drawable.gr_ptn_03));
floatBackground.addFloatView(new FloatCircle( 0.8f, 0.8f));
floatBackground.addFloatView(new FloatText( 0.3f, 0.6f, "E"));
floatBackground.addFloatView(new FloatRing( 0.6f, 0.2f, 15 ,20));
浮物”时:floatBackground.addFloatView(new FloatText( 0.3f, 0.6f, “E”))
接收的三个参数分别为出生位置在屏幕宽的百分比,长的百分比,和显示的文字。
Github
https://github.com/a396901990/FloatBackground
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android漂浮背景效果
# Android漂浮背景
# Android背景效果
# Android TextView设置背景色与边框的方法详解
# Android ListView的item背景色设置和item点击无响应的解决方法
# Android selector背景选择器的使用详解
# android 自定义ScrollView实现背景图片伸缩的实现代码及思路
# android实现背景平铺的三种方法
# Android实现沉浸式通知栏通知栏背景颜色跟随app导航栏背景颜色而改变
# Android编程实现popupwindow弹出后屏幕背景变成半透明效果
# android中实现背景图片颜色渐变方法
# Android编程简单实现ImageView点击时背景图修改的方法
# Android中实现布局背景模糊化处理的方法
# 贝尔
# 画出
# 自定义
# 重写
# 漂浮物
# 都是
# 布朗运动
# 很好
# 放在
# 也没
# 在此
# 可以通过
# 很简单
# 有兴趣
# 找了
# 做一个
# 想过
# 详细介绍
# 分别为
# 好用
相关文章:
建站之星安装路径如何正确选择及配置?
建站之星代理平台如何选择最佳方案?
c# 在高并发场景下,委托和接口调用的性能对比
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
建站主机选择指南:服务器配置与SEO优化实战技巧
javascript基本数据类型及类型检测常用方法小结
利用JavaScript实现拖拽改变元素大小
贸易公司网站制作流程,出口贸易网站设计怎么做?
如何在IIS管理器中快速创建并配置网站?
图册素材网站设计制作软件,图册的导出方式有几种?
手机网站制作与建设方案,手机网站如何建设?
建站之星导航菜单设置与功能模块配置全攻略
建站三合一如何选?哪家性价比更高?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
建站之星安装失败:服务器环境不兼容?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
如何快速登录WAP自助建站平台?
网站制作免费,什么网站能看正片电影?
网站app免费制作软件,能免费看各大网站视频的手机app?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
如何在腾讯云服务器快速搭建个人网站?
如何快速生成凡客建站的专业级图册?
如何用已有域名快速搭建网站?
建站主机功能解析:服务器选择与快速搭建指南
网站制作难吗安全吗,做一个网站需要多久时间?
制作网站的软件免费下载,免费制作app哪个平台好?
文字头像制作网站推荐软件,醒图能自动配文字吗?
网页设计网站制作软件,microsoft office哪个可以创建网页?
临沂网站制作公司有哪些,临沂第四中学官网?
建站之星导航如何优化提升用户体验?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
建站之星官网登录失败?如何快速解决?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
北京网站制作网页,网站升级改版需要多久?
如何快速生成ASP一键建站模板并优化安全性?
定制建站策划方案_专业建站与网站建设方案一站式指南
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
太平洋网站制作公司,网络用语太平洋是什么意思?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何配置FTP站点权限与安全设置?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
如何基于云服务器快速搭建网站及云盘系统?
北京网站制作的公司有哪些,北京白云观官方网站?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
h5在线制作网站电脑版下载,h5网页制作软件?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
*请认真填写需求信息,我们会在24小时内与您取得联系。