package com.ydl.ydlcommon.utils;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import com.yidianling.common.tools.RxDeviceTool;
import com.yidianling.common.tools.RxImageTool;
/**
* 绘制波纹
* Created by Dog on 2015/7/22.
*/
public class DrawCircleShapeUtil{
//点击drawable
ShapeDrawable mClickDrawable;
//消失动画
ValueAnimator mStartValueAnimation, mEndValueAnimation;
//绘制区域
Rect mDrawRect;
//点击的点
int startX, startY;
//扩展区域
final int initSize, finalSize;
//开始扩展大小
int startSize;
//上下文
Context mContext;
//绑定的view
View mView;
//画笔颜色
int mPaintColor = Color.rgb(200, 200, 200);
//最大透明度
int mBaseAlpha = 80;
public DrawCircleShapeUtil(View view){
mContext = view.getContext();
initSize = RxImageTool.dp2px(30);
finalSize = RxDeviceTool.getScreenWidth(view.getContext()) << 1;
mView = view;
mClickDrawable = new ShapeDrawable(new OvalShape());
setPaintColor(mPaintColor);
mDrawRect = new Rect();
mStartValueAnimation = new ValueAnimator();
mStartValueAnimation.setInterpolator(new DecelerateInterpolator());
mStartValueAnimation.setDuration(3000);
mStartValueAnimation.setFloatValues(1.0f, 0.0f);
mStartValueAnimation.addUpdateListener(new StartAnimation());
mEndValueAnimation = new ValueAnimator();
mEndValueAnimation.setInterpolator(new DecelerateInterpolator());
mEndValueAnimation.setDuration(300);
mEndValueAnimation.setFloatValues(1.0f, 0.0f);
mEndValueAnimation.addUpdateListener(new EndAnimation());
if(view instanceof ViewGroup){
view.setWillNotDraw(false);
}
}
public void setPaintColor(int color){
mPaintColor = color & 0x00ffffff;
mClickDrawable.getPaint().setColor(mPaintColor + (mBaseAlpha << 24));
}
/**
* 触摸事件
* @return 是否消耗
*/
public boolean onTouchEvent(MotionEvent event){
startSize = Math.max(initSize,
mView.getMeasuredHeight() > mView.getMeasuredWidth() ? mView.getMeasuredWidth() : mView.getMeasuredHeight()
);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:{
startX = (int) event.getX();
startY = (int) event.getY();
mClickDrawable.getPaint().setColor(mPaintColor + (mBaseAlpha << 24));
mEndValueAnimation.cancel();
mStartValueAnimation.setDuration(3000);
mStartValueAnimation.start();
break;
}
case MotionEvent.ACTION_MOVE:{
startX = (int) event.getX();
startX = startX < 0 ? 0 : startX;
startX = startX > mView.getMeasuredWidth() ? mView.getMeasuredWidth() : startX;
startY = (int) event.getY();
startY = startY < 0 ? 0 : startY;
startY = startY > mView.getMeasuredHeight() ? mView.getMeasuredHeight() : startY;
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:{
int minSize = Math.max(mView.getMeasuredWidth(), mView.getMeasuredHeight()) * 3 / 4;
if(startSize < minSize){
startSize = minSize;
}
mStartValueAnimation.setCurrentPlayTime(
mStartValueAnimation.getCurrentPlayTime() / 10
);
mStartValueAnimation.setDuration(300);
mEndValueAnimation.start();
}
}
return true;
}
/**
* 在View绘制的时候调用
* @param canvas 绘制
*/
public void onDraw(Canvas canvas){
mClickDrawable.setBounds(mDrawRect);
mClickDrawable.draw(canvas);
}
class StartAnimation implements ValueAnimator.AnimatorUpdateListener{
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float v = (float) animation.getAnimatedValue();
int size = (int) (finalSize + v*(startSize - finalSize)) >> 1;
if(size > 0) {
mDrawRect.set(startX - size, startY - size, startX + size, startY + size);
mView.invalidate();
}
}
}
class EndAnimation implements ValueAnimator.AnimatorUpdateListener{
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float v = (float) animation.getAnimatedValue();
int alpha = (int) (v*mBaseAlpha);
mClickDrawable.getPaint().setColor(mPaintColor + (alpha << 24));
mView.invalidate();
}
}
}