自定义组件

自定义组件

step 1、继承 View 类

public class RockerView extends View {
	// 构造函数
	public RockerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

step 2、重载 OnMeasure 函数

该函数可以认为是固定操作

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int measureWidth, measureHeight;

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        if (widthMode == MeasureSpec.EXACTLY) {
            measureWidth = widthSize;
        } else {
            measureWidth = DEFAULT_SIZE;
        }
        if (heightMode == MeasureSpec.EXACTLY) {
            measureHeight = heightSize;
        } else {
            measureHeight = DEFAULT_SIZE;
        }
        setMeasuredDimension(measureWidth, measureHeight);
    }

step 3、重载 OnDraw 函数

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

该函数传入一张画布 canvas,在 canvas 中绘制想要的形状。

step 4、重载 OnTouchEvent 函数

该函数位组件的事件监听函数。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 按下行为
            case MotionEvent.ACTION_MOVE:
                // 拖动行为
                break;
            case MotionEvent.ACTION_UP:
	            // 抬起行为
	            break;
            case MotionEvent.ACTION_CANCEL:
                // 行为动作结束
                break;
        }
        return true;
    }

step 5、配置接口函数

通过设置接口函数,可以有效的将组件的各个状态、数据,在适当的位置触发用户想要的操作,例如在获取到位置和角度数据的同时,调用接口函数,用户通过设置接口函数,来处理获取到的位置和角度数据。

public void setOnShakeListener(com.v5lab.fishrobot.selfview.RockerView.OnShakeListener listener) {
    mOnShakeListener = listener;
}

public interface OnShakeListener {
	void onStart();
    void getData(double angle, double distance);
    void onFinish();
}
LICENSED UNDER CC BY-NC-SA 4.0