Android自定义View实现波浪动画
本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下
效果演示
代码调用与实现效果
xml中调用
实现原理
属性配置
attrs.xml文件中,进行属性配置
获取属性,同时对属性赋默认值
finalTypedArrayarray=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
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
finalintwidth=getWidth();
finalintheight=getHeight();
finalintwaveHeight=(int)(getHeight()*mQuadrant);
//绘制背景
canvas.drawColor(mWaveBKColor);
mWavePath.moveTo(0,height);
mWavePath.lineTo(0,waveHeight);
for(inti=1;i<=width;i++){
//绘制正弦曲线y=ASin(ωt+ρ)=Asin(2πft+ρ)
finalfloaty=(float)(waveHeight+mAmplitude*Math.sin(2*Math.PI*i*mFrequency+mShift));
mWavePath.lineTo(i,y);
}
//将曲线闭合
mWavePath.lineTo(width,height);
canvas.drawPath(mWavePath,mWavePaint);
}
波浪动画
这时波浪应该已经绘制完成了,下面使用Handler中的周期任务实现动画效果.
//创建一个周期任务,它的职责是改变正弦曲线的偏移量
finalclassWaveAnimationimplementsRunnable{
@Override
publicvoidrun(){
mWavePath.reset();
mShift+=mSpeed;
invalidate();
Wave.this.postDelayed(this,DEFAULT_PERIOD);
}
}
在View被创建的时候让它进行执行
//开始波浪动画 postDelayed(newWaveAnimation(),DEFAULT_PERIOD);
完整代码
publicclassWaveextendsView{
//默认属性值
privatestaticfinalintDEFAULT_AMPLITUDE=200;
privatestaticfinalintDEFAULT_PERIOD=16;
privatestaticfinalfloatDEFAULT_SPEED=.1F;
privatestaticfinalfloatDEFAULT_QUADRANT=.33F;
privatestaticfinalfloatDEFAULT_FREQUENCY=1F/360F;
privatestaticfinalintDEFAULT_WAVE_COLOR=Color.parseColor("#64B5F6");
privatestaticfinalintDEFAULT_WAVE_BK_COLOR=Color.parseColor("#EEEEEE");
@SuppressWarnings("FieldCanBeLocal")
@ColorInt
privateintmWaveColor;
@ColorInt
privateintmWaveBKColor;
//振幅
privateintmAmplitude;
//波浪位于View的位置
privatefloatmQuadrant;
//波浪的频率,这个值越大,波浪越密集
privatefloatmFrequency;
//速度
privatefloatmSpeed;
privatefloatmShift;
privatefinalPaintmWavePaint=newPaint(Paint.ANTI_ALIAS_FLAG);
privatefinalPathmWavePath=newPath();
publicWave(Contextcontext){
this(context,null);
}
publicWave(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicWave(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
init(context,attrs);
}
privatevoidinit(Contextcontext,AttributeSetset){
finalTypedArrayarray=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(newWaveAnimation(),DEFAULT_PERIOD);
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
finalintwidth=getWidth();
finalintheight=getHeight();
finalintwaveHeight=(int)(getHeight()*mQuadrant);
//绘制背景
canvas.drawColor(mWaveBKColor);
mWavePath.moveTo(0,height);
mWavePath.lineTo(0,waveHeight);
for(inti=1;i<=width;i++){
//绘制正弦曲线y=ASin(ωt+ρ)=Asin(2πft+ρ)
finalfloaty=(float)(waveHeight+mAmplitude*Math.sin(2*Math.PI*i*mFrequency+mShift));
mWavePath.lineTo(i,y);
}
//将曲线闭合
mWavePath.lineTo(width,height);
canvas.drawPath(mWavePath,mWavePaint);
}
finalclassWaveAnimationimplementsRunnable{
@Override
publicvoidrun(){
mWavePath.reset();
mShift+=mSpeed;
invalidate();
Wave.this.postDelayed(this,DEFAULT_PERIOD);
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。