全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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漂浮背景效果  # Android漂浮背景  # Android背景效果  # Android TextView设置背景色与边框的方法详解  # Android ListView的item背景色设置和item点击无响应的解决方法  # Android selector背景选择器的使用详解  # android 自定义ScrollView实现背景图片伸缩的实现代码及思路  # android实现背景平铺的三种方法  # Android实现沉浸式通知栏通知栏背景颜色跟随app导航栏背景颜色而改变  # Android编程实现popupwindow弹出后屏幕背景变成半透明效果  # android中实现背景图片颜色渐变方法  # Android编程简单实现ImageView点击时背景图修改的方法  # Android中实现布局背景模糊化处理的方法  # 贝尔  # 画出  # 自定义  # 重写  # 漂浮物  # 都是  # 布朗运动  # 很好  # 放在  # 也没  # 在此  # 可以通过  # 很简单  # 有兴趣  # 找了  # 做一个  # 想过  # 详细介绍  # 分别为  # 好用 


相关文章: 小说建站VPS选用指南:性能对比、配置优化与建站方案解析  网站制作费用多少钱,一个网站的运营,需要哪些费用?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何选择CMS系统实现快速建站与SEO优化?  建站主机无法访问?如何排查域名与服务器问题  实现虚拟支付需哪些建站技术支撑?  无锡营销型网站制作公司,无锡网选车牌流程?  建站之星如何防范黑客攻击与数据泄露?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  黑客如何利用漏洞与弱口令入侵网站服务器?  济南企业网站制作公司,济南社保单位网上缴费步骤?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  定制建站流程解析:需求评估与SEO优化功能开发指南  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  建站之星图片链接生成指南:自助建站与智能设计教程  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  网站制作壁纸教程视频,电脑壁纸网站?  网站制作说明怎么写,简述网页设计的流程并说明原因?  Swift中swift中的switch 语句  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  北京建设网站制作公司,北京古代建筑博物馆预约官网?  建站之星如何实现五合一智能建站与营销推广?  如何设置并定期更换建站之星安全管理员密码?  高防服务器:AI智能防御DDoS攻击与数据安全保障  海南网站制作公司有哪些,海口网是哪家的?  相册网站制作软件,图片上的网址怎么复制?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  电脑免费海报制作网站推荐,招聘海报哪个网站多?  如何通过主机屋免费建站教程十分钟搭建网站?  建站之星2.7模板:企业网站建设与h5定制设计专题  如何访问已购建站主机并解决登录问题?  建站上传速度慢?如何优化加速网站加载效率?  制作电商网页,电商供应链怎么做?  北京企业网站设计制作公司,北京铁路集团官方网站?  怀化网站制作公司,怀化新生儿上户网上办理流程?  网站微信制作软件,如何制作微信链接?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  浅析上传头像示例及其注意事项  网站制作的步骤包括,正确网址格式怎么写?  简历在线制作网站免费版,如何创建个人简历?  高防服务器租用如何选择配置与防御等级?  如何在香港免费服务器上快速搭建网站?  历史网站制作软件,华为如何找回被删除的网站?  电商网站制作公司有哪些,1688网是什么意思?  Android使用GridView实现日历的简单功能  如何快速搭建二级域名独立网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。