前两天朋友找我实现一个水波纹的效果,因为这块一直没做过,所以花了一上午时间研究一下,参考了网上的一些方法,得知Android还有Path.quadTo()这么一个方法。

话不多说,代码如下:

public class MyView extends View implements View.OnClickListener {    private int mRippleWeight;//一个波的周期长度    private  int mRippleCount;    private int mScreenWidth;    private int mScreenHeight;    private int mCenterY;//需要展示的位置中线    private int mOffset;    private Path mPath;    private Paint mPaint;    private ValueAnimator mValueAnimatior;    public MyView(Context context) {        super(context);    }    public MyView(Context context, AttributeSet attrs) {        super(context, attrs);        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setStyle(Paint.Style.STROKE);//        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);//如若需要下方带颜色可用此样式        mPaint.setStrokeWidth(8);        mPaint.setAntiAlias(true);        mPaint.setColor(Color.BLACK);    }    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        mPath = new Path();        mScreenHeight = getMeasuredHeight();        mScreenWidth = getMeasuredWidth();        mCenterY = mScreenWidth / 2;        mRippleWeight = mScreenHeight / 2;        mRippleCount = Math.round(mScreenWidth / mRippleWeight + 2);        setOnClickListener(this);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPath.reset();//重置笔画        mPath.moveTo(-mRippleWeight,mCenterY);//波走完重新的起点        /**         * 如若波上下不够大,仅需修改mCenterY + 400及mCenterY - 400,         * 如若波左右不够大,请把mRippleWeight值变大         */        for (int i = 0;i <  mRippleCount;i++) {            mPath.quadTo(-mRippleWeight * 3 / 4 + i * mRippleWeight + mOffset,mCenterY + 100,-mRippleWeight / 2 + i * mRippleWeight + mOffset,mCenterY);            mPath.quadTo(-mRippleWeight / 4 + i * mRippleWeight + mOffset,mCenterY - 100,i * mRippleWeight + mOffset,mCenterY);        }        canvas.drawPath(mPath,mPaint);    }    @Override    public void onClick(View v) {        mValueAnimatior = ValueAnimator.ofInt(0, mRippleWeight);        mValueAnimatior.setDuration(800);        mValueAnimatior.setInterpolator(new LinearInterpolator());        mValueAnimatior.setRepeatCount(ValueAnimator.INFINITE);        mValueAnimatior.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                mOffset = (int) animation.getAnimatedValue();                invalidate();            }        });        mValueAnimatior.start();    }} 当然觉得还不明白的可以下载我写的一个demo,链接如下:http://download.csdn.net/download/qq_28767927/9897370

更多相关文章

  1. Android 页面自动跳转方法(比如进入app的广告,通过Timer计时器,通过
  2. android开源代码编译方法
  3. Activity中那些需要重写的方法
  4. Android为什么会有65536的方法数量限制
  5. Android Studio ——Android 使用Pull方法解析XML文件的方法
  6. 记录关于Gradle : Build Running的解决方法
  7. Android 开机震动的调用位置以及打开关闭方法
  8. Android中计算text文字大小的几个方法

随机推荐

  1. Android中Toast的使用
  2. Android自定义属性时TypedArray的使用方
  3. android 工程横竖屏设置无效 cocos2dx v3
  4. 【Android每周专题】Android中的逆向工程
  5. Android关于ThreadLocal的思考和总结
  6. [置顶] Android(安卓)从硬件到应用:一步一
  7. 【专题报道】Google I/O开发者大会
  8. Android(安卓)自定义控件入门篇之自定义
  9. Android(安卓)进程保活手段分析
  10. Android:多语言对应