Android自定义View开关

Android自定义开关

/**
* 1.创建一个类,继承VIew
* 2.覆写三个构造方法,进行对象的初始化操作
* 3.覆写OnMeasure,确定控件的宽高大小
* 4.覆写OnDrawer,绘制出控件的静态效果
* 5.实现点击滑动按钮的效果,View类具备点击监听
* 6.覆写手势监听,实现滑动根据手指滑动而移动
* 7.完善手势监听,实现滑到中间的时候,能够根据当前中间的值,自动滑到左边或者右边
*/

public class MyView extends View implements View.OnClickListener {

private Paint paint;//画笔
private Bitmap switch_a;//按钮底部图片
private Bitmap slide_b;//按钮上面的图片
private float slideLeft = 0;
private boolean isOpen = false;//开关状态
private float isLeftRight;//最大值
private int lastx;

private int newx;

private boolean isDrop = false;//点击还是滑动


//记录开关·当前的状态
private boolean isToggleStateListenerOn;

public MyView(Context context) {
    this(context, null);
}


public MyView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
}

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

private void initView(Context context, @Nullable AttributeSet attrs) {
    //创建画笔
    paint = new Paint();
    //创建图片
    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyViewButton);
    BitmapDrawable b1 = (BitmapDrawable) array.getDrawable(R.styleable.MyViewButton_switch_background);
    BitmapDrawable b2 = (BitmapDrawable) array.getDrawable(R.styleable.MyViewButton_slide_button);
    switch_a = b1.getBitmap();
    slide_b = b2.getBitmap();


    //switch_a = BitmapFactory.decodeResource(getResources(), R.drawable.switch_a);
    //slide_b = BitmapFactory.decodeResource(getResources(), R.drawable.slide_b);
    //点击滑动的最大值
    isLeftRight = switch_a.getWidth() - slide_b.getWidth();
    MyView.this.setOnClickListener(this);

}

//设置按钮的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //把背景图片的大小作为按钮的大小
    setMeasuredDimension(switch_a.getWidth(), switch_a.getHeight());
}

//展示静态效果
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //绘制两张图片 作为按钮
    canvas.drawBitmap(switch_a, 0, 0, paint);

    canvas.drawBitmap(slide_b, slideLeft, 0, paint);
}

//按钮的点击事件
@Override
public void onClick(View v) {
    Log.d("MyView", "onClick");
    //点击按钮时的操作

    if (isDrop) {
        //如果是点击就执行if里的代码
        //点击按钮实现开和关的操作
        if (isOpen) {
            slideLeft = isLeftRight;
        } else {
            slideLeft = 0;
        }

        isOpen = !isOpen;

        invalidate();
        if (toggleStateListener!=null) {
            toggleStateListener.onToggleState(isOpen);
        }
    }
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:

            Log.d("MyView", "DOWN");
            //点击时的坐标
            lastx = (int) event.getX();
            //改变状态为滑动
            isDrop = true;
            break;
        case MotionEvent.ACTION_MOVE:
            Log.d("MyView", "MOVE");
            //滑动时的X坐标
            newx = (int) event.getX();
            //
            int offsetx = newx - lastx;

            slideLeft = slideLeft + offsetx;

            lastx = newx;
            huadong();
            break;
        case MotionEvent.ACTION_UP:
            Log.d("MyView", "UP");
            if (!isDrop) {

                if (slideLeft > isLeftRight / 2) {
                    isOpen = true;
                } else if (slideLeft <= isLeftRight / 2) {
                    isOpen = false;
                }

                if (isOpen) {
                    slideLeft = isLeftRight;
                } else {
                    slideLeft = 0;
                }


                invalidate();
            }

            break;
    }
    return true;
}

private void huadong() {

    if (slideLeft < 0) {
        slideLeft = 0;
    } else if (slideLeft > isLeftRight) {
        slideLeft = isLeftRight;

    }

    invalidate();
}



//定义接口
public interface OnToggleStateListener {
    void onToggleState(boolean isOpen);
}
//接口对象
private OnToggleStateListener toggleStateListener;

public void setOnToggleStateListener(OnToggleStateListener listener) {
    toggleStateListener = listener;
}

}

猜你喜欢

转载自blog.csdn.net/qpdb19981023/article/details/80566678
今日推荐