全网整合营销服务商

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

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

Android自定义View实现支付宝咻一咻效果

本篇文章介绍自定义View配合属性动画来实现如下的效果

实现思路挺简单:

  • 画一个半透明的圆
  • 实现两种动画效果,点击时扩散和不点击时扩散回收
  • 使用线程的方式将上面两步结合起来

首先看下画半透明圆的部分

public class ClickCircleView extends View {
 private Bitmap bitmap;
 private Paint paint;
 private Canvas canvas;
 private boolean isSpreadFlag = false;//标记是否发射完成

 public boolean isSpreadFlag() {
  return isSpreadFlag;
 }

 public void setIsSpreadFlag(boolean isSpreadFlag) {
  this.isSpreadFlag = isSpreadFlag;
 }

 public ClickCircleView(Context context, int width, int height, int screenWidth, int screenHeight) {
  super(context);
  bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888); // 设置位图的宽高
  canvas = new Canvas();
  canvas.setBitmap(bitmap);
  paint = new Paint(Paint.DITHER_FLAG);
  paint.setAntiAlias(true);
  paint.setColor(Color.WHITE);
  paint.setStyle(Paint.Style.FILL);
  paint.setAlpha(50);
  canvas.drawCircle(screenWidth / 2, screenHeight / 2, width / 2 + 10, paint);
  invalidate();
 }

 @Override
 protected void onDraw(Canvas canvas) {
  canvas.drawBitmap(bitmap, 0, 0, null);
 }
}

可以看到相关的属性都是设置在画笔上,然后直接调用画布的drawCircle()方法画出一个半透明的圆,最后调用invalidate()方法刷新View
一定要重写父类的onDraw()方法,否则自定义View不能生效
我们设置了一个标志位isSpreadFlag,作用是用来标记扩散动画是否完成

然后我们来实现两个动画效果

点击时扩散动画

<set xmlns:android="http://schemas.android.com/apk/res/android">
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleY"
  android:valueFrom="1.0"
  android:valueTo="1.8"
  android:valueType="floatType" />
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleX"
  android:valueFrom="1.0"
  android:valueTo="1.8"
  android:valueType="floatType" />
</set>

很简单,就是改变scale值,增大到1.8倍

不点击时扩散回收动画

<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:ordering="together">
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleX"
  android:valueFrom="1.0"
  android:valueTo="1.2"
  android:valueType="floatType" />
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleY"
  android:valueFrom="1.0"
  android:valueTo="1.2"
  android:valueType="floatType" />
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleX"
  android:startOffset="1000"
  android:valueFrom="1.2"
  android:valueTo="1.0"
  android:valueType="floatType" />
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleY"
  android:startOffset="1000"
  android:valueFrom="1.2"
  android:valueTo="1.0"
  android:valueType="floatType" />
</set>

和上个动画类似,startOffset参数可以用来控制Animation的运行顺序,比如Android:startOffset=”1000”表示设置该属性的动画延迟1秒执行

然后就是用线程来执行动画和逻辑的部分了

不点击时的动画部分

mXiuyixiuButton.post(new Runnable() {
   @Override
   public void run() {
    clickCircleView = new ClickCircleView(CustomView1.this, mXiuyixiuButton.getWidth()
      , mXiuyixiuButton.getHeight(), mXiuyixiuLayout.getMeasuredWidth(),
      mXiuyixiuLayout.getMeasuredHeight());
    clickCircleView.setVisibility(View.VISIBLE);
    mXiuyixiuLayout.addView(clickCircleView);
    mXiuyixiuLayout.postInvalidate();
    // 加载动画
    final Animator anim = AnimatorInflater.loadAnimator(CustomView1.this,
      R.animator.circle_scale_animator);
    anim.addListener(new AnimatorListenerAdapter() {
     @Override
     public void onAnimationEnd(Animator animation) {
      if (anim != null) {
       anim.start();//循环执行动画
      }
     }
    });
    anim.setTarget(clickCircleView);
    anim.start();
   }
  });

初始化好clickCircleView之后将这个view加入父布局中,然后加载动画并设置循环执行,最后使用postInvalidate()在子线程中刷新view

点击时的动画部分

mXiuyixiuButton.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    clickCircleView.setVisibility(View.GONE);//发射圆圈,即将循环动画View隐藏
    final ClickCircleView item = new ClickCircleView(CustomView1.this, mXiuyixiuButton.getWidth()
      , mXiuyixiuButton.getHeight(), mXiuyixiuLayout.getWidth(),
      mXiuyixiuLayout.getHeight());
    Animator spreadAnim = AnimatorInflater.loadAnimator(CustomView1.this,
      R.animator.circle_spread_animator);
    spreadAnim.addListener(new AnimatorListenerAdapter() {
     @Override
     public void onAnimationEnd(Animator animation) {
      item.setIsSpreadFlag(true);//动画执行完成,标记一下
     }
    });
    spreadAnim.setTarget(item);
    spreadAnim.start();
    clickCircleViewList.add(item);
    mXiuyixiuLayout.addView(item);
    mXiuyixiuLayout.invalidate();
    handler.post(circleViewRunnable);
   }
  });


隐藏不点击动画,初始化好ClickCircleView后将该view加入List中并添加到父布局中,然后加载动画并在动画结束时添加isSpreadFlag标记,最后调用invalidate()方法刷新view并开启线程

线程部分

private Runnable circleViewRunnable = new Runnable() {
  public void run() {
   for (int i = 0; i < clickCircleViewList.size(); i++) {
    if (clickCircleViewList.get(i).isSpreadFlag()) {
     mXiuyixiuLayout.removeView(clickCircleViewList.get(i));
     clickCircleViewList.remove(i);
     mXiuyixiuLayout.postInvalidate();
    }
   }
   if (clickCircleViewList.size() <= 0) {
    clickCircleView.setVisibility(View.VISIBLE);
   }
   handler.postDelayed(this, 100);
  }
 };

遍历list,将有isSpreadFlag标记的view从list和父布局中移除并刷新view,最后判断list如果为空的话将不点击时的动画显示出来

最后记得在onDestroy()里移除线程

@Override
 protected void onDestroy() {
  super.onDestroy();
  handler.removeCallbacks(circleViewRunnable);
 }

使用自定义View配合属性动画来实现该效果耦合性较高,只是这种方式相比完全使用自定义View来说更加流畅,该方式大部分参考别人博客上的代码来实现,但是如果仅仅只是就拿来用不总结是不会成为自己的知识的,因此有了这篇博客。

参考: android实现支付宝咻一咻的几种思路方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # 支付宝  # 咻一咻  # Android 自定义view仿支付宝咻一咻功能  # Android中RecyclerView布局代替GridView实现类似支付宝的界面  # Android波纹扩散效果之仿支付宝咻一咻功能实现波纹扩散特效  # Android app第三方支付宝支付接入教程  # Android支付宝支付封装代码  # Android支付宝和微信支付集成  # Android开发之实现GridView支付宝九宫格  # Android仿支付宝支付从底部弹窗效果  # Android支付宝支付设计开发  # 支付宝咻一咻怎么用 Android帮你实现咻一咻  # 自定义  # 来实现  # 加载  # 移除  # 自己的  # 都是  # 两种  # 遍历  # 并在  # 较高  # 博客  # 很简单  # 可以看到  # 几种  # 重写  # 将有  # 后将  # 这篇  # 结合起来  # 上个 


相关文章: 网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  已有域名如何免费搭建网站?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何快速搭建个人网站并优化SEO?  相册网站制作软件,图片上的网址怎么复制?  建站之星如何快速解决建站难题?  如何快速选择适合个人网站的云服务器配置?  网页设计与网站制作内容,怎样注册网站?  行程制作网站有哪些,第三方机票电子行程单怎么开?  红河网站制作公司,红河事业单位身份证如何上传?  北京网站制作公司哪家好一点,北京租房网站有哪些?  香港服务器如何优化才能显著提升网站加载速度?  ,巨量百应是干嘛的?  如何基于云服务器快速搭建个人网站?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  如何通过VPS建站实现广告与增值服务盈利?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何在橙子建站上传落地页?操作指南详解  建站VPS能否同时实现高效与安全翻墙?  Python文件管理规范_工程实践说明【指导】  制作企业网站建设方案,怎样建设一个公司网站?  专业公司网站制作公司,用什么语言做企业网站比较好?  如何确保FTP站点访问权限与数据传输安全?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  如何快速生成凡客建站的专业级图册?  如何零基础在云服务器搭建WordPress站点?  h5网站制作工具有哪些,h5页面制作工具有哪些?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  建站VPS配置与SEO优化指南:关键词排名提升策略  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  如何基于云服务器快速搭建网站及云盘系统?  太平洋网站制作公司,网络用语太平洋是什么意思?  微信小程序 五星评分(包括半颗星评分)实例代码  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  如何在Golang中指定模块版本_使用go.mod控制版本号  实惠建站价格推荐:2025年高性价比自助建站套餐解析  Python多线程使用规范_线程安全解析【教程】  建站之星2.7模板快速切换与批量管理功能操作指南  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何高效配置IIS服务器搭建网站?  建站之星收费标准详解:套餐费用及年费价格表一览  如何在IIS管理器中快速创建并配置网站?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  python的本地网站制作,如何创建本地站点?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  动图在线制作网站有哪些,滑动动图图集怎么做? 

您的项目需求

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