Android应用开发之Android自定义水波纹效果-升级款
凌雪 2018-11-29 来源 :网络 阅读 1355 评论 0

摘要:本文将带你了解Android应用开发之Android自定义水波纹效果-升级款,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android自定义水波纹效果-升级款,希望本文对大家学Android有所帮助。


public   class WaveView1 extends View {
    //波浪画笔
    private Paint mPaint1;
    private Paint mPaint2;
    private Paint mPaint3;
    //波浪Path类
    private Path mPath1;
    private Path mPath2;
    private Path mPath3;
    //一个波浪长度
    private int mWaveLength = 1000;
    //波纹个数
    private int mWaveCount;
    //平移偏移量
    private int mOffset;
    //波纹的中间轴
    private int mCenterY;
    //屏幕高度
    private int mScreenHeight;
    //屏幕宽度
    private int mScreenWidth;
    private float xOff;
    private float yOff;
    private float height;
    public WaveView1(Context context, AttributeSet attrs) {
    super(context, attrs);
    xOff = AndroidUtils.dp2px(getContext(), 20);
    yOff = AndroidUtils.dp2px(getContext(), 5);
    height = AndroidUtils.dp2px(getContext(), 15);
    mPath1 = new Path();
    mPath2 = new Path();
    mPath3 = new Path();
    mPaint1 = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint1.setColor(ContextCompat.getColor(context,   R.color.color_4dffffff));
    mPaint1.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint2 = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint2.setColor(ContextCompat.getColor(context,   R.color.color_81ffffff));
    mPaint2.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint3 = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint3.setColor(Color.WHITE);
    mPaint3.setStyle(Paint.Style.FILL_AND_STROKE);
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    mScreenHeight = h;
    mScreenWidth = w;
    //加1.5:至少保证波纹有2个,至少2个才能实现平移效果
    mWaveCount = (int) Math.round(mScreenWidth / mWaveLength + 1.5);
    mCenterY = mScreenHeight / 2;
    }
    @Override
    protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mPath1.reset();
    mPath2.reset();
    mPath3.reset();
    //移到屏幕外最左边
    mPath1.moveTo(-mWaveLength + mOffset, mCenterY);
    mPath2.moveTo(-mWaveLength + mOffset, mCenterY + yOff);
    mPath3.moveTo(-mWaveLength + mOffset, mCenterY + 2 * yOff);
    for (int i = 0; i < mWaveCount; i++) {
    //正弦曲线1
    mPath1.quadTo((-mWaveLength * 3 / 4) + (i * mWaveLength) + mOffset + xOff,   mCenterY + height, (-mWaveLength / 2) + (i * mWaveLength) + mOffset + xOff,   mCenterY);
    mPath1.quadTo((-mWaveLength / 4) + (i * mWaveLength) + mOffset + xOff,   mCenterY - height, i * mWaveLength + mOffset + xOff, mCenterY);
    //正弦曲线2
    mPath2.quadTo((-mWaveLength * 3 / 4) + (i * mWaveLength) + mOffset + 2 *   xOff, mCenterY + yOff + height, (-mWaveLength / 2) + (i * mWaveLength) +   mOffset + 2 * xOff, mCenterY + yOff);
    mPath2.quadTo((-mWaveLength / 4) + (i * mWaveLength) + mOffset + 2 * xOff,   mCenterY + yOff - height, i * mWaveLength + mOffset + 2 * xOff, mCenterY +   yOff);
    //正弦曲线3
    mPath3.quadTo((-mWaveLength * 3 / 4) + (i * mWaveLength) + mOffset + 3 *   xOff, mCenterY + 2 * yOff + height, (-mWaveLength / 2) + (i * mWaveLength) +   mOffset + 3 * xOff, mCenterY + 2 * yOff);
    mPath3.quadTo((-mWaveLength / 4) + (i * mWaveLength) + mOffset + 3 * xOff,   mCenterY + 2 * yOff - height, i * mWaveLength + mOffset + 3 * xOff, mCenterY   + 2 * yOff);
    }
    //填充矩形
    mPath1.lineTo(mScreenWidth, mScreenHeight);
    mPath1.lineTo(0, mScreenHeight);
    mPath2.lineTo(mScreenWidth, mScreenHeight);
    mPath2.lineTo(0, mScreenHeight);
    mPath3.lineTo(mScreenWidth, mScreenHeight);
    mPath3.lineTo(0, mScreenHeight);
    //mPath.close();
    canvas.drawPath(mPath1, mPaint1);
    canvas.drawPath(mPath2, mPaint2);
    canvas.drawPath(mPath3, mPaint3);
    }
    ValueAnimator animator = ValueAnimator.ofInt(0, mWaveLength);
    public void startAnim() {
    animator.setDuration(5000);
    animator.setRepeatCount(ValueAnimator.INFINITE);
    animator.setInterpolator(new LinearInterpolator());
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()   {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
    mOffset = (int) animation.getAnimatedValue();
    postInvalidate();
    }
    });
    animator.start();
    }
    public void stopAnimate() {
    if (animator != null) {
    animator.pause();
    }
    }    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved