您的位置:首页 > 其它

圆形波动效果按钮

2016-12-28 20:38 162 查看
最近做项目需要写一个圆形按钮外围有(两个两层波动效果那种)

那就只有自定义控件啦

思路:先画一个渐变颜色的圆形:

//设置渐变色
shader = new LinearGradient(
0, 0,
0, radius,
0xff80abe7,
0xff4c71a6,
Shader.TileMode.MIRROR);
paint.setShader(shader);
canvas.drawOval(..,paint)


同样的画两个外围的圆形,由于后面画的图会覆盖前面的,所以最大的圆形先画

关键:使用属性动画动态更新数值

由于需要更新的数值有:外围圆形的半径,第二层圆形的半径,和颜色透明度

就需要自定义一个实体类,使用代码如下:

ValueAnimator mValueAnimator = ValueAnimator.ofObject(new WaveChangeDataEvaluator(), new WaveChangeData(0, 0, 128), new WaveChangeData(insideRadius + outsideRadius, insideRadius, 0));
mValueAnimator.setRepeatCount(ValueAnimator.INFINITE);
mValueAnimator.setRepeatMode(ValueAnimator.RESTART);
mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
WaveChangeData currentWaveChangeData = (WaveChangeData) animation.getAnimatedValue();
outsideRadiusChange = currentWaveChangeData.outsideRadiusChange;
insideRadiusChange = currentWaveChangeData.insideRadiusChange;
alphaChange = currentWaveChangeData.alpha;
invalidate();
}
});
mValueAnimator.setInterpolator(new LinearInterpolator());
mValueAnimator.setDuration(1500);
mValueAnimator.start();


可以知道ValueAnimator.ofObject方法第一个参数是定义对象的变化计算方式,后面两个参数就是变化的起始值和最终值

在就是监听属性动画的数值变化来刷新控件

WaveChangeDataEvaluator的代码:

public class WaveChangeDataEvaluator implements TypeEvaluator {

@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
WaveChangeData start = (WaveChangeData) startValue;
WaveChangeData end = (WaveChangeData) endValue;
float outsideRadiusChange = start.outsideRadiusChange + (fraction * (end.outsideRadiusChange - start.outsideRadiusChange));
float insideRadiusChange = start.insideRadiusChange + (fraction * (end.insideRadiusChange - start.insideRadiusChange));
int alpha = start.alpha + (int) (fraction * (end.alpha - start.alpha));
WaveChangeData result = new WaveChangeData(outsideRadiusChange, insideRadiusChange, alpha);
return result;
}

}


在这里只要知道fraction(0.0–1.0)代表当前属性动画进度的百分比,就知道怎么计算

总结,使用自定义属性动画ValueAnimator.ofObject来更新,自定义控件中的一些数值,来实现动态效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  控件