android 水波纹动画,Android ValueAnimator做水波纹效果

0818b9ca8b590ca3270a3433284dd417.png

其实就一个这样的效果啦,用 ValueAnimator 实现的

public class RippleView extends View{ private int width,height; private Bitmap bm; private int bitmapWidth,bitmapHeight; private Paint paint=new Paint(); private Paint onePaint=new Paint(); private Paint twoPaint=new Paint(); private Paint threePaint=new Paint(); private Paint fourPaint=new Paint(); private int interval=40; private int minRadius=0; private int maxRadius=0; private int oneRadius,twoRadius,threeRadius,fourRadius; private float maxAlpha=255,oneAlpha,twoAlpha,threeAlpha,fourAlpha; public RippleView(Context context, AttributeSet attrs) { super(context, attrs); bm=BitmapFactory.decodeResource(getResources(), R.drawable.phone); bitmapWidth=bm.getWidth(); bitmapHeight=bm.getHeight(); paint.setAntiAlias(true); paint.setStyle(Style.STROKE); paint.setStrokeWidth(10); paint.setColor(Color.RED); onePaint.setAntiAlias(true); //onePaint.setStyle(Style.STROKE); //onePaint.setStrokeWidth(10); //onePaint.set onePaint.setColor(Color.YELLOW); twoPaint.setAntiAlias(true); twoPaint.setColor(Color.YELLOW); threePaint.setAntiAlias(true); threePaint.setColor(Color.YELLOW); fourPaint.setAntiAlias(true); fourPaint.setColor(Color.YELLOW); width=(int) context.getResources().getDimension(R.dimen.width); height=(int) context.getResources().getDimension(R.dimen.height); minRadius=bitmapWidth/2+interval; maxRadius=width/2; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); onePaint.setAlpha((int)oneAlpha); canvas.drawCircle(width/2, height/2, oneRadius, onePaint); twoPaint.setAlpha((int)twoAlpha); canvas.drawCircle(width/2, height/2, twoRadius, twoPaint); threePaint.setAlpha((int)threeAlpha); canvas.drawCircle(width/2, height/2, threeRadius, threePaint); fourPaint.setAlpha((int)fourAlpha); canvas.drawCircle(width/2, height/2, fourRadius, fourPaint); drawCenterView(canvas); } private void drawCenterView(Canvas canvas){ canvas.drawBitmap(bm, width/2-bitmapWidth/2, height/2-bitmapHeight/2, paint); } public void startAnimation(){ ValueAnimator oneAnimator=ValueAnimator.ofInt(minRadius,maxRadius).setDuration(2000); oneAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { oneRadius=(Integer) animation.getAnimatedValue(); oneAlpha=maxAlpha-maxAlpha/(maxRadius-minRadius)*1.0f*(oneRadius-minRadius); postInvalidate(); } }); oneAnimator.setRepeatCount(ValueAnimator.INFINITE); oneAnimator.setRepeatMode(ValueAnimator.RESTART); //oneAnimator.setStartDelay(500); oneAnimator.start(); ValueAnimator twoAnimator=ValueAnimator.ofInt(minRadius,maxRadius).setDuration(2000); twoAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { twoRadius= (Integer) animation.getAnimatedValue(); twoAlpha=maxAlpha-maxAlpha/(maxRadius-minRadius)*1.0f*(twoRadius-minRadius); postInvalidate(); } }); twoAnimator.setRepeatCount(ValueAnimator.INFINITE); twoAnimator.setRepeatMode(ValueAnimator.RESTART); twoAnimator.setStartDelay(500); twoAnimator.start(); ValueAnimator threeAnimator=ValueAnimator.ofInt(minRadius,maxRadius).setDuration(2000); threeAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { threeRadius=(Integer) animation.getAnimatedValue(); threeAlpha=maxAlpha-maxAlpha/(maxRadius-minRadius)*1.0f*(threeRadius-minRadius); postInvalidate(); } }); threeAnimator.setRepeatCount(ValueAnimator.INFINITE); threeAnimator.setRepeatMode(ValueAnimator.RESTART); threeAnimator.setStartDelay(500+500); threeAnimator.start(); ValueAnimator fourAnimator=ValueAnimator.ofInt(minRadius,maxRadius).setDuration(2000); fourAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { fourRadius=(Integer) animation.getAnimatedValue(); fourAlpha=maxAlpha-maxAlpha/(maxRadius-minRadius)*1.0f*(fourRadius-minRadius); postInvalidate(); } }); fourAnimator.setRepeatCount(ValueAnimator.INFINITE); fourAnimator.setRepeatMode(ValueAnimator.RESTART); fourAnimator.setStartDelay(1500); fourAnimator.start(); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值