自定义View水波纹

package com.bwie.guilin.demolian;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

public class WaterView extends View {

    private Paint mPaintTop;
    private Paint mPaintBottom;
    private Path mPathTop;
    private Path mPathBottom;
    private float φ;
    private int topcolor,bottomcolor;


    public WaterView(Context context) {
        super(context);
        init(context);
    }


    public WaterView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        TypedArray ty = context.obtainStyledAttributes(attrs, R.styleable.WaterView);
        topcolor = ty.getColor(R.styleable.WaterView_topcolor, Color.WHITE);
        bottomcolor = ty.getColor(R.styleable.WaterView_bottom, Color.WHITE);
        ty.recycle();
        init(context);
    }

    public WaterView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        mPaintTop = new Paint();
        mPaintTop.setColor(topcolor);
        mPaintTop.setAntiAlias(true);
        mPaintBottom = new Paint();

        mPaintBottom.setColor(bottomcolor);
        mPaintBottom.setAntiAlias(true);
        mPaintBottom.setAlpha(60);
        mPathTop = new Path();
        mPathBottom = new Path();

    }


    //绘制
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPathTop.reset();
        mPathBottom.reset();
        //路径起始的位置
        mPathTop.moveTo(getLeft(), getBottom());
        mPathBottom.moveTo(getLeft(), getBottom());
        //获取每个宽度所占的度数
        double mY = Math.PI * 2 / getWidth();
        //从左往右
        φ -= 0.1f;

        //路径移动的坐标
        for (float x = 0; x <= getWidth(); x += 20) {
            float y = (float) (10 * Math.cos(mY * x + φ)+10);
            mPathTop.lineTo(x, y);
            mPathBottom.lineTo(x, (float) (10 * Math.sin(mY * x + φ)));
            listener.ann(y);
        }


        //路径终止的位置
        mPathTop.lineTo(getRight(), getBottom());
        mPathBottom.lineTo(getRight(), getBottom());

        canvas.drawPath(mPathTop, mPaintTop);
        canvas.drawPath(mPathBottom, mPaintBottom);
        //更新ui
        postInvalidateDelayed(20);

    }

    private AListener listener;

    public void getListener(AListener listener) {
        this.listener = listener;
    }

    //传递y值
    public interface AListener {
        void ann(float y);
    }


}



在 Activitivity里面获取

package com.bwie.guilin.demolian;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ImageView logo = (ImageView) findViewById(R.id.logo);
        WaterView waterView = (WaterView) findViewById(R.id.wave_view);
        final RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) logo.getLayoutParams();
        waterView.getListener(new WaterView.AListener() {
            @Override
            public void ann(float y) {
                params.setMargins(0, 0, 0, (int) y);
                logo.setLayoutParams(params);
            }
        });
    }
}


//主方法

public class FragmentHome extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_home, null, false);
        final ImageView logo=(ImageView)view.findViewById(R.id.logo);
        final RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) logo.getLayoutParams();
        WaterView water_view=(WaterView)view.findViewById(R.id.water_view);
        water_view.getAnn(new WaterView.AnnListener() {
            @Override
            public void getY(float y) {
                //设置y 的值
                params.setMargins(0,0,0, (int) y);
                logo.setLayoutParams(params);
            }
        });
        return view;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值