博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 兼容的RippleView
阅读量:6911 次
发布时间:2019-06-27

本文共 7438 字,大约阅读时间需要 24 分钟。

hot3.png

RippleView的java 控件类

import android.annotation.SuppressLint;import android.content.Context;import android.content.res.TypedArray;import android.graphics.*;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.animation.AccelerateDecelerateInterpolator;import android.widget.Button;import android.widget.LinearLayout;import com.gx.cloud.zhyd.R;import com.nineoldandroids.animation.Animator;import com.nineoldandroids.animation.ObjectAnimator;import com.nineoldandroids.view.ViewHelper;@SuppressLint("ClickableViewAccessibility")public class RippleView extends LinearLayout {    private float mDownX;    private float mDownY;    private float mAlphaFactor;    private float mDensity;    private float mRadius;    private float mMaxRadius;    private int mRippleColor;    private boolean mIsAnimating = false;    private boolean mHover = true;    private RadialGradient mRadialGradient;    private Paint mPaint;    private ObjectAnimator mRadiusAnimator;    private int dp(int dp) {        return (int) (dp * mDensity + 0.5f);    }    public RippleView(Context context) {        this(context, null);    }    public RippleView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public RippleView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();        TypedArray a = context.obtainStyledAttributes(attrs,                R.styleable.RippleView);        mRippleColor = a.getColor(R.styleable.RippleView_rippleColor,                mRippleColor);        mAlphaFactor = a.getFloat(R.styleable.RippleView_alphaFactor,                mAlphaFactor);        mHover = a.getBoolean(R.styleable.RippleView_hover, mHover);        a.recycle();    }    public void init() {        mDensity = getContext().getResources().getDisplayMetrics().density;        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setAlpha(100);        setRippleColor(Color.BLACK, 0.2f);    }    public void setRippleColor(int rippleColor, float alphaFactor) {        mRippleColor = rippleColor;        mAlphaFactor = alphaFactor;    }    public void setHover(boolean enabled) {        mHover = enabled;    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        mMaxRadius = (float) Math.sqrt(w * w + h * h);    }    private boolean mAnimationIsCancel;    private Rect mRect;    @Override    public boolean onTouchEvent(final MotionEvent event) {        Log.d("TouchEvent", String.valueOf(event.getActionMasked()));        Log.d("mIsAnimating", String.valueOf(mIsAnimating));        Log.d("mAnimationIsCancel", String.valueOf(mAnimationIsCancel));        boolean superResult = super.onTouchEvent(event);        if (event.getActionMasked() == MotionEvent.ACTION_DOWN                && this.isEnabled() && mHover) {            mRect = new Rect(getLeft(), getTop(), getRight(), getBottom());            mAnimationIsCancel = false;            mDownX = event.getX();            mDownY = event.getY();            mRadiusAnimator = ObjectAnimator.ofFloat(this, "radius", 0, dp(50))                    .setDuration(400);            mRadiusAnimator                    .setInterpolator(new AccelerateDecelerateInterpolator());            mRadiusAnimator.addListener(new Animator.AnimatorListener() {                @Override                public void onAnimationStart(Animator animator) {                    mIsAnimating = true;                }                @Override                public void onAnimationEnd(Animator animator) {                    setRadius(0);                    ViewHelper.setAlpha(RippleView.this, 1);                    mIsAnimating = false;                }                @Override                public void onAnimationCancel(Animator animator) {                }                @Override                public void onAnimationRepeat(Animator animator) {                }            });            mRadiusAnimator.start();            if (!superResult) {                return true;            }        } else if (event.getActionMasked() == MotionEvent.ACTION_MOVE                && this.isEnabled() && mHover) {            mDownX = event.getX();            mDownY = event.getY();            // Cancel the ripple animation when moved outside            if (mAnimationIsCancel = !mRect.contains(                    getLeft() + (int) event.getX(),                    getTop() + (int) event.getY())) {                setRadius(0);            } else {                setRadius(dp(50));            }            if (!superResult) {                return true;            }        } else if (event.getActionMasked() == MotionEvent.ACTION_UP                && !mAnimationIsCancel && this.isEnabled()) {            mDownX = event.getX();            mDownY = event.getY();            final float tempRadius = (float) Math.sqrt(mDownX * mDownX + mDownY                    * mDownY);            float targetRadius = Math.max(tempRadius, mMaxRadius);            if (mIsAnimating) {                mRadiusAnimator.cancel();            }            mRadiusAnimator = ObjectAnimator.ofFloat(this, "radius", dp(50),                    targetRadius);            mRadiusAnimator.setDuration(500);            mRadiusAnimator                    .setInterpolator(new AccelerateDecelerateInterpolator());            mRadiusAnimator.addListener(new Animator.AnimatorListener() {                @Override                public void onAnimationStart(Animator animator) {                    mIsAnimating = true;                }                @Override                public void onAnimationEnd(Animator animator) {                    setRadius(0);                    ViewHelper.setAlpha(RippleView.this, 1);                    mIsAnimating = false;                }                @Override                public void onAnimationCancel(Animator animator) {                }                @Override                public void onAnimationRepeat(Animator animator) {                }            });            mRadiusAnimator.start();            if (!superResult) {                return true;            }        }        return superResult;    }    public int adjustAlpha(int color, float factor) {        int alpha = Math.round(Color.alpha(color) * factor);        int red = Color.red(color);        int green = Color.green(color);        int blue = Color.blue(color);        return Color.argb(alpha, red, green, blue);    }    public void setRadius(final float radius) {        mRadius = radius;        if (mRadius > 0) {            mRadialGradient = new RadialGradient(mDownX, mDownY, mRadius,                    adjustAlpha(mRippleColor, mAlphaFactor), mRippleColor,                    Shader.TileMode.MIRROR);            mPaint.setShader(mRadialGradient);        }        invalidate();    }    private Path mPath = new Path();    @Override    protected void onDraw(final Canvas canvas) {        super.onDraw(canvas);        if (isInEditMode()) {            return;        }        canvas.save(Canvas.CLIP_SAVE_FLAG);        mPath.reset();        mPath.addCircle(mDownX, mDownY, mRadius, Path.Direction.CW);        canvas.clipPath(mPath);        canvas.restore();        canvas.drawCircle(mDownX, mDownY, mRadius, mPaint);    }}

一些属性

ripple:alphaFactor="0.7"ripple:rippleColor="#58FAAC"ripple:hover="true"

转载于:https://my.oschina.net/u/3136970/blog/920014

你可能感兴趣的文章
我的友情链接
查看>>
fuelphp学习和知识积累
查看>>
mysql_backup.sh
查看>>
LNMP环境添加第三方模块
查看>>
我的友情链接
查看>>
关于sublime text3 格式化代码快捷方式的添加和如何破解sublime text3
查看>>
oracle goldengate报错解决之OGG-00446、OGG-00529、OGG-00014
查看>>
leetCode 70. Climbing Stairs | 动态规划
查看>>
Juniper vSRX防火墙 HA配置
查看>>
shell date命令使用
查看>>
suse11系统rpm包离线安装gcc
查看>>
Linux下进程控制实验
查看>>
linux 返回上次访问目录命令
查看>>
H3C MSR路由器v7 AAA本地用户权限笔记
查看>>
Basic Linux Commands :date, clock, hwclock, cal, ls, pwd, whereis, which, who, w, whoami
查看>>
MySQL的root密码忘记后重置方法
查看>>
Linux--htop取代top的强大进程监视器
查看>>
MySQL集群简单介绍
查看>>
“登陆网站”还是“登录网站”
查看>>
论文笔记:Mastering the game of Go with deep neural net
查看>>