我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android漂浮背景效果的制作方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android漂浮背景效果的制作方法

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 TextView设置背景色与边框的方法详解Android ListView的item背景色设置和item点击无响应的解决方法Android selector背景选择器的使用详解android 自定义ScrollView实现背景图片伸缩的实现代码及思路android实现背景平铺的三种方法Android实现沉浸式通知栏通知栏背景颜色跟随app导航栏背景颜色而改变Android编程实现popupwindow弹出后屏幕背景变成半透明效果android中实现背景图片颜色渐变方法Android编程简单实现ImageView点击时背景图修改的方法Android中实现布局背景模糊化处理的方法


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android漂浮背景效果的制作方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android漂浮背景效果的制作方法

GIF动图效果不是很好,实际效果非常平滑very smooth,而且添加不同的图形可以组成各种效果,目前已经用在我们项目的注册界面~原理: 实现原理很简单,每一个悬浮的“小物体”就是一个自定义View,这些小的自定义View都盛放在一个自定
2022-06-06

Android编程之书架效果背景图处理方法

本文实例讲述了Android编程之书架效果背景图处理方法。分享给大家供大家参考,具体如下: 在android应用中,做一个小说阅读器是很多人的想法,大家一般都是把如何读取大文件,如果在滚动或是翻页时,让用户感觉不到做为重点。我也在做一个类似
2022-06-06

ppt设置背景填充效果的方法

这篇文章主要介绍了ppt设置背景填充效果的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ppt背景填充效果在【设置背景格式】中,其设置背景填充效果的方法:首先新建幻灯片;
2023-06-14

如何使用CSS制作渐变背景颜色的效果

如何使用CSS制作渐变背景颜色的效果背景色渐变效果能够为网页增添美观和吸引力。在CSS中,我们可以使用渐变背景色来实现这一效果。本文将介绍如何使用CSS来制作渐变背景色的效果,并提供具体的代码示例。一、线性渐变(Linear gradien
2023-10-25

Android制作漂亮自适布局键盘的方法

最近做了个自定义键盘,但面对不同分辨率的机型其中数字键盘不能根据界面大小自已铺满,但又不能每种机型都做一套吧,所以要做成自适应,那这里主讲思路。这里最上面的titlebar高度固定,下面输入的金额高度也固定(当然也可以自适应),主要是中间的
2022-06-06

如何使用CSS制作交替渐变效果的背景图片

背景图片是网页设计中不可或缺的一部分,能够增添页面的美感和吸引力。而使用CSS来实现背景图片的效果也是一种常见的做法。本文将介绍如何使用CSS来制作交替渐变效果的背景图片,并提供具体的代码示例。一、准备工作在开始之前,我们需要准备一些基本的
2023-10-21

如何通过纯CSS实现漂浮动画效果的方法和技巧

如何通过纯CSS实现漂浮动画效果的方法和技巧在现代网页设计中,动画效果已成为吸引用户眼球的重要元素之一。而其中一种常见的动画效果就是漂浮效果,它可以给网页增加一种动感和活力,使得用户体验更加丰富和有趣。本文将介绍如何通过纯CSS实现漂浮动画
2023-10-25

利用CSS实现元素的模糊背景效果的方法

利用CSS实现元素的模糊背景效果的方法,需要具体代码示例随着Web设计的不断发展,如何让页面元素呈现出优雅、独特的效果成为了设计师们关注的焦点之一。其中一种常见的效果是模糊背景。通过将元素的背景进行模糊处理,可以增强界面的层次感和美观度。在
利用CSS实现元素的模糊背景效果的方法
2023-11-21

Android中使用Matrix控制图形变换和制作倒影效果的方法

最近在使用Matrix进行绘图的操作。对Matrix的一些方法有了一些更深的体会,记下来,以便日后复习。 Matrix常用的方法: 一、变换方法: Matrix提供了translate(平移)、rotate(旋转)、scale(缩放)、sk
2022-06-06

Android应用中制作选中后图标变大浮动效果的代码分享

最近在玩3g体育门户客户端的时候,看到这样个效果: 轻触赛事图标,会有一个图标变大浮出的效果.,蛮有意思的.于是就把仿照它做了一个. 这个是原图: 实际上是给图标的触摸事件中添加了一个缩放的动画,代码如下.
2022-06-06

Android实现定制返回按钮动画效果的方法

今天我们来讲一讲Andorid中如何定制返回按钮的动画效果。我将结合实际应用来阐述如何使用。 首先来看一个效果截图,有一个搜索按钮在一个页面的顶部:我之前实现的方式是和百度/Google首页搜索的效果一样的,类似web开发中的ajax请求,
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录