效果图

思想

1.绘制气泡

随机xy轴,r半径,速度,随机xy方向(方向就是x和y加减同一个随机偏移量),随机透明度

2.气泡移动和复用气泡

在原来的xy+=或者-=偏移量,每一次便宜判断xy是否超过屏幕宽度和高度,超过就重新随机生成

3.代码实现

制气泡效果
public class QiPao extends View {public Paint paint;public DisplayMetrics displayMetrics;public QiPao(Context context) {this(context,null);}public QiPao(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);displayMetrics = context.getResources().getDisplayMetrics();init();}public QiPao(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}Timer timer;@SuppressLint("ResourceAsColor")public void init(){paint = new Paint();paint.setAntiAlias(true);timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {postInvalidate();//在子线程中执行  postInvalidate()会使onDrow()方法得到执行}}, 300, 10);for (int i = 0; i <100 ; i++) {QiPaoPoin qiPaoPoin = new QiPaoPoin();//点的位置qiPaoPoin.setX(random.nextFloat()*displayMetrics.widthPixels);qiPaoPoin.setY(random.nextFloat()*displayMetrics.heightPixels);int v = random.nextInt(2)+1;qiPaoPoin.setxSke(random.nextFloat()*((v==1)?2:-2));v = random.nextInt(2)+1;qiPaoPoin.setySke(random.nextFloat()*((v==1)?2:-2));qiPaoPoin.setDiaph(random.nextInt(100)+100);qiPaoPoin.setSpeet(random.nextFloat());//圆的半径qiPaoPoin.setRadius(random.nextInt(170)+30);list.add(qiPaoPoin);}}@SuppressLint("NewApi")@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);aaa();list.forEach((element)->{paint.setARGB(element.getDiaph(),255,255,255);canvas.drawCircle(element.getX(),element.getY(),element.getRadius(),paint);});}List<QiPaoPoin> list =new ArrayList<>();Random random = new Random();float yske,xske;//xy轴偏移量int radius;//半径public void aaa(){for (int i = 0; i <list.size() ; i++) {yske = list.get(i).getySke();//y偏移xske = list.get(i).getxSke();//x偏移radius = list.get(i).getRadius();//半径//如果不是按住就解锁if(!isDown){list.get(i).setLock(false);}if(list.get(i).isLock()){if(isMove){//跟随鼠标移动list.get(i).setY(lastY);list.get(i).setX(lastX);}}else {//点击不动if(isDown&&(lastX<=list.get(i).getX()+list.get(i).getRadius()&&lastX>=list.get(i).getX()-list.get(i).getRadius())&&(lastY<=list.get(i).getY()+list.get(i).getRadius()&&lastY>=list.get(i).getY()-list.get(i).getRadius())){if(isMove){//跟随鼠标移动list.get(i).setY(lastY);list.get(i).setX(lastX);list.get(i).setLock(true);}}else {//这里才是真正的复用 和实现移动气泡if(list.get(i).getY()-(yske+radius)<displayMetrics.heightPixels&&list.get(i).getY()-(yske+radius)>-radius*2){list.get(i).setY(list.get(i).getY()+yske);}else {//结束完随机y轴出现 和任意方向飘动list.get(i).setY(random.nextFloat()*displayMetrics.heightPixels);
//                int v = random.nextInt(2)+1;
//                list.get(i).setxSke(random.nextFloat()*((v==1)?3:-3));
//                v = random.nextInt(2)+1;
//                list.get(i).setySke(random.nextFloat()*((v==1)?3:-3));}if(list.get(i).getX()-(xske+radius)<displayMetrics.widthPixels&&list.get(i).getX()-(xske+radius)>-radius*2){list.get(i).setX(list.get(i).getX()+xske);}else{//结束完随机x轴出现  和任意方向飘动list.get(i).setX(random.nextFloat()*displayMetrics.widthPixels);int v = random.nextInt(2)+1;list.get(i).setxSke(random.nextFloat()*((v==1)?2:-2));v = random.nextInt(2)+1;list.get(i).setySke(random.nextFloat()*((v==1)?2:-2));}}}}}public int lastX,lastY;public boolean isDown,isMove;@Overridepublic boolean onTouchEvent(MotionEvent event) {int x = (int) event.getX();int y = (int) event.getY();switch (event.getAction()){case MotionEvent.ACTION_DOWN:// 记录触摸点坐标lastX = x;lastY = y;isDown = true;break;case MotionEvent.ACTION_MOVE:lastX = x;lastY = y;isMove = true;break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:isDown = false;isMove = false;break;}return true;}public void dis(){timer.cancel();}

Android 绘制气泡相关推荐

  1. android 代码设置textview draw,Android 自定义气泡TextView

    效果如下: 可以设置颜色.描边.三角形高度和方向,以向上居中和向下居中为例 气泡.png 实现思路: 使用Canvas绘制气泡形状,因为气泡中间只显示文字,所以我直接继承TextView,重写onDr ...

  2. android背景气泡,android之View跟LinearLayout的重写(实现背景气泡和波纹效果)

    android之View和LinearLayout的重写(实现背景气泡和波纹效果) 前两天看了仿android L里面水波纹效果的两篇博客 Android L中水波纹点击效果的实现 Android自定 ...

  3. android 聊天气泡_android聊天气泡在android中构建ios风格的聊天

    android 聊天气泡 重点 (Top highlight) In this post, we'll explore how to do two things: 1) create live cha ...

  4. android 呼吸气泡动画,Android:会呼吸的悬浮气泡

    Android:会呼吸的悬浮气泡 写在前面 最早看到这个效果是 MIUI6 系统升级界面,有很多五颜六色的气泡悬浮着,觉得很好看. 可惜现在找不到动态图了.而且虽然 MIUI8 更新界面也有类似的气泡 ...

  5. Android绘制流程

    一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL. Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. ...

  6. android绘制高亮区域,实现高亮某行的RecyclerView效果

    最终效果 全部代码:github 方式有二 组合控件,RecyclerView + View 自定义RecyclerView 1中只需要控制View,但是不好封装. 2中需要重写RecyclerVie ...

  7. android绘制view的过程

    1 android绘制view的过程简单描述  简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw):             下面看看每一步的动作到底 ...

  8. Android绘制(三):Path结合属性动画, 让图标动起来!

    Android绘制(一):来用shape绘出想要的图形吧! Android绘制(二):来用Path绘出想要的图形吧! 目录 效果图 前言 绘制 属性动画 最后 效果图 不废话, 直接上效果图, 感兴趣 ...

  9. android绘制矢量图_Android矢量可绘制

    android绘制矢量图 In this tutorial, we'll be discussing Android Vector Drawable. Furthermore, we'll be im ...

最新文章

  1. Java处理高并发、高负载类网站的优化方法
  2. 使用Win32汇编开发一个dll并在C#中调用
  3. python 预测足球_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!...
  4. 【荐】中国最有潜力的十位企业家(IT行业占大半)
  5. go int 转切片_「快学 Go 语言」第 4 课——低调的数组
  6. [合作赞助]九叔生日由中国移动、51cto、奇虎360以及一帆浩瀚联合举办
  7. mysql 编码种类_MySQL 编码
  8. [RHEL5企业级Linux服务攻略]--第1季 Linux服务器的搭建与测试
  9. 基于阈值和深度学习的玉米常见锈病严重程度自动模糊逻辑预测(工具+综述+玉米锈病严重程度数据集)
  10. refprop物性库_refprop 9.0 下载-refprop9.0 32/64位下载(NIST物性查询软件) 中文版 - 河东下载站...
  11. ElasticSearch查询模板
  12. 基于Flink的JDBC插入Nested结构数据到Clickhouse
  13. Element UI Table表格样式调整
  14. ubuntu 软件管理
  15. 围绕开放标准改进WSO2 API Manager密钥管理体系结构
  16. improve your Github overview page
  17. Python变量与字符串操作
  18. 微服务架构下的服务调用与鉴权——某保险公司微服务平台实施案例分享
  19. 华为固件解包工具linux,华为app固件解包工具下载
  20. 工作绩效数据、工作绩效报告和工作绩效信息的区别

热门文章

  1. C# bartender打印帮助类,单个打印以及批量打印方法封装
  2. 360安全浏览器如何锁定极速模式
  3. 背景与字体的搭配经验
  4. 二建机电实务视频教程
  5. 机器学习——聚类分析
  6. bootstrap 页面垂直居中_bootstrap4如何实现div的水平居中以及垂直居中
  7. 盘点最适宜旅游过年的中国名城
  8. canoe 分析log_CANoe教程 | 分析功能-Trace窗口
  9. 图书管理系统-数据库设计
  10. linux ps aux tty,linux ps命令中的tty表示什么意思?