热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android自定义View实现波浪动画

这篇文章主要为大家详细介绍了Android自定义View实现波浪动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下

效果演示

代码调用与实现效果

xml中调用

实现原理

属性配置

attrs.xml文件中,进行属性配置

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
  
  
  
  
  
  
  
  
  
  
  
  
  
 

获取属性,同时对属性赋默认值

final TypedArray array = context.obtainStyledAttributes(set, R.styleable.Wave);
  mSpeed = array.getFloat(R.styleable.Wave_speed, DEFAULT_SPEED);
  mWaveColor = array.getColor(R.styleable.Wave_waveColor, DEFAULT_WAVE_COLOR);
  mWaveBKColor = array.getColor(R.styleable.Wave_waveBackgroundColor, DEFAULT_WAVE_BK_COLOR);
  mAmplitude = array.getInt(R.styleable.Wave_amplitude, DEFAULT_AMPLITUDE);
  mQuadrant = array.getFloat(R.styleable.Wave_quadrant, DEFAULT_QUADRANT);
  mFrequency = array.getFloat(R.styleable.Wave_frequency, DEFAULT_FREQUENCY);
  array.recycle();

绘制波浪

在onDraw()中使用Canvas进行绘制即可,这里需要注意的正弦曲线的绘制.

正弦曲线(y=Asin(ωx+φ)+k)的一些参数如下:

A——振幅,当物体作轨迹符合正弦曲线的直线往复运动时,其值为行程的1/2。
(ωx+φ)——相位,反映变量y所处的状态。
φ——初相,x=0时的相位;反映在坐标系上则为图像的左右移动。
k——偏距,反映在坐标系上则为图像的上移或下移。
ω——角速度, 控制正弦周期(单位角度内震动的次数)。

onDraw中的代码:

@Override
protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 final int width = getWidth();
 final int height = getHeight();

 final int waveHeight = (int) (getHeight() * mQuadrant);
 // 绘制背景
 canvas.drawColor(mWaveBKColor);
 mWavePath.moveTo(0, height);
 mWavePath.lineTo(0, waveHeight);
 for (int i = 1; i <= width; i++) {
  // 绘制正弦曲线 y = A Sin(ωt+ ρ) = A sin(2πft + ρ)
  final float y = (float) (waveHeight + mAmplitude * Math.sin(2 * Math.PI * i * mFrequency + mShift));
  mWavePath.lineTo(i, y);
 }
 // 将曲线闭合
 mWavePath.lineTo(width, height);
 canvas.drawPath(mWavePath, mWavePaint);
}

波浪动画

这时波浪应该已经绘制完成了,下面使用Handler中的周期任务实现动画效果.

// 创建一个周期任务,它的职责是改变正弦曲线的偏移量
 final class WaveAnimation implements Runnable {

  @Override
  public void run() {
   mWavePath.reset();
   mShift += mSpeed;
   invalidate();
   Wave.this.postDelayed(this, DEFAULT_PERIOD);
  }
 }

在View被创建的时候让它进行执行

// 开始波浪动画
postDelayed(new WaveAnimation(), DEFAULT_PERIOD);

完整代码

public class Wave extends View {

 // 默认属性值
 private static final int DEFAULT_AMPLITUDE = 200;
 private static final int DEFAULT_PERIOD = 16;
 private static final float DEFAULT_SPEED = .1F;
 private static final float DEFAULT_QUADRANT = .33F;
 private static final float DEFAULT_FREQUENCY = 1F / 360F;
 private static final int DEFAULT_WAVE_COLOR = Color.parseColor("#64B5F6");
 private static final int DEFAULT_WAVE_BK_COLOR = Color.parseColor("#EEEEEE");

 @SuppressWarnings("FieldCanBeLocal")
 @ColorInt
 private int mWaveColor;
 @ColorInt
 private int mWaveBKColor;
 // 振幅
 private int mAmplitude;
 // 波浪位于View的位置
 private float mQuadrant;
 // 波浪的频率,这个值越大,波浪越密集
 private float mFrequency;

 // 速度
 private float mSpeed;
 private float mShift;

 private final Paint mWavePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 private final Path mWavePath = new Path();



 public Wave(Context context) {
  this(context, null);
 }

 public Wave(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
 }

 public Wave(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  init(context, attrs);
 }

 private void init(Context context, AttributeSet set) {
  final TypedArray array = context.obtainStyledAttributes(set, R.styleable.Wave);
  mSpeed = array.getFloat(R.styleable.Wave_speed, DEFAULT_SPEED);
  mWaveColor = array.getColor(R.styleable.Wave_waveColor, DEFAULT_WAVE_COLOR);
  mWaveBKColor = array.getColor(R.styleable.Wave_waveBackgroundColor, DEFAULT_WAVE_BK_COLOR);
  mAmplitude = array.getInt(R.styleable.Wave_amplitude, DEFAULT_AMPLITUDE);
  mQuadrant = array.getFloat(R.styleable.Wave_quadrant, DEFAULT_QUADRANT);
  mFrequency = array.getFloat(R.styleable.Wave_frequency, DEFAULT_FREQUENCY);
  array.recycle();

  mWavePaint.setStrokeWidth(2);
  mWavePaint.setColor(mWaveColor);

  // 开始波浪动画
  postDelayed(new WaveAnimation(), DEFAULT_PERIOD);
 }


 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  final int width = getWidth();
  final int height = getHeight();

  final int waveHeight = (int) (getHeight() * mQuadrant);
  // 绘制背景
  canvas.drawColor(mWaveBKColor);
  mWavePath.moveTo(0, height);
  mWavePath.lineTo(0, waveHeight);
  for (int i = 1; i <= width; i++) {
   // 绘制正弦曲线 y = A Sin(ωt+ ρ) = A sin(2πft + ρ)
   final float y = (float) (waveHeight + mAmplitude * Math.sin(2 * Math.PI * i * mFrequency + mShift));
   mWavePath.lineTo(i, y);
  }
  // 将曲线闭合
  mWavePath.lineTo(width, height);
  canvas.drawPath(mWavePath, mWavePaint);
 }


 final class WaveAnimation implements Runnable {

  @Override
  public void run() {
   mWavePath.reset();
   mShift += mSpeed;
   invalidate();
   Wave.this.postDelayed(this, DEFAULT_PERIOD);
  }
 }
}

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


推荐阅读
  • 前期部署1.JDK安装,配置PATH2.下载spark-1.6.1-bin-hadoop2.6.tgz,并上传到服务器解压3.在 usr 下创建软链接到目标文件夹4.修改配置文件, ... [详细]
  • Win7操作系统建立无线虚拟wifi
    网络适配器中的microsoftvirtualwifiminiportadapter是windows7的隐藏功能,虚拟wifi。正确的运用这个功能,就可以把电脑当做路由器了。注 ... [详细]
  • @JsonField和@JsonProperty的使用和区别
    @JsonFieldJsonField是位于fastjson包下的,实体类序列化为json字符串的时候,此类的原字段,序列化为json中的规定的字段配合JSON.toJSONStr ... [详细]
  • [191]python3.6下scrapy框架的安装
    首先考虑使用最简单的方法安装pipinstallscrapy命令安装,提示FailedbuildingwheelforTwistedMicrosoftVisual ... [详细]
  • 1、war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块;jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运行的。2、wa ... [详细]
  • DimmyCompasnewMySTAComponent()PublicSubPage_Load()myComp.Name=BobEndSub  首选机 ... [详细]
  • spring data jpa介绍以及基础示例
    JPA介绍JPA的全称是JavaPersistenceAPI,提供了一个规范,用于将数据通过Java对象持久化、读取和管理数据库中的关系表。所以JPA本质上就是一种ORM规 ... [详细]
  • 我有一个用C#编写的服务器,需要从Java1.6与之对话.我需要连接到服务器,保持连接,并双向发送消息.消息是一个int(消息的长度),然后是一个XML文件.做这个的最好方式是什么 ... [详细]
  • MyBatis笔记04分页查询、resultMap的简单使用
    MyBatis笔记04-----分页查询、resultMap的简单使用-分页查询1、分页查询的好处MyBatis作为持久层框架,主要任务就是操作数据库,即是对数据的增、删、查 ... [详细]
  • 小编典典UCanAccess是一个纯JavaJDBC驱动程序,它使我们无需使用ODBC即可读写Access数据库。它使用其他两个软件包Jackcess和HSQLDB来 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了WPF动态添加带有detals的ListViewItem相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 开始仔细学习WPF了说是动画不流畅,可以通过设置帧率解决,查了很多,都说设置Timeline.DesiredFrameRateProperty,但都没说加到哪里,在代码很多地方加上 ... [详细]
  • ros:cartographer(二)整体介绍
    cartographer的doc中给出了这个图。现在我还没看过源码,所以只能猜测一些内容。待看完源码后,再详细介绍这个图。直观地说,左侧 ... [详细]
  • 系统被描述为不依赖于底层技术的服务服务通过消息实现1SOA涉及到服务的提供者和消费者参与SOA的系统是服务提供者,还是服务的消费者,要视工作流而定服务和消息是无状态的2服务和消费者 ... [详细]
  • 本文目录一览:1、哪有免费的JAVA教程?2、 ... [详细]
author-avatar
大美妞庄严典雅__
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有