Android自定义控件---滑动开关

1.自定义滑动开关控件


public class SlideButton extends View {


private Bitmap switchBG;// 滑动开关的背景
private Bitmap slideButtonBG; // 滑动块的背景
private boolean currentState = false;// 开关当前的状态, 默认为: 关闭
private int currentX;// x轴的偏移量
private boolean isSliding = false;// 是否正在滑动中
private OnToggleStateChangedListener mListener;


public SlideButton(Context context, AttributeSet attrs) {
super(context, attrs);

initBitmap();
}


/**
* 当测量当前控件的宽高时回调
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

// 设置开关的宽和高
setMeasuredDimension(switchBG.getWidth(), switchBG.getHeight());
}


/**
* 绘制当前控件的方法
*/
@Override
protected void onDraw(Canvas canvas) {

// 1. 把滑动开关的背景画到画布上
canvas.drawBitmap(switchBG, 0, 0, null);// 把背景平铺到控件上

// 2. 绘制滑动块显示的位置, 开或者关

if(isSliding) {
int left = currentX - (slideButtonBG.getWidth() / 2);
if(left < 0) {
left = 0;
} else if(left > switchBG.getWidth() - slideButtonBG.getWidth()) {
left = switchBG.getWidth() - slideButtonBG.getWidth();
}

canvas.drawBitmap(slideButtonBG, left, 0, null);
} else {
if(currentState) {// 绘制开关为开的状态
canvas.drawBitmap(slideButtonBG, switchBG.getWidth() - slideButtonBG.getWidth(), 0, null);
} else { // 绘制开关为关的状态
canvas.drawBitmap(slideButtonBG, 0, 0, null);
}
}
super.onDraw(canvas);
}


/**
* 当产生触摸时间时回调此方法
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // 按下
currentX = (int) event.getX();
isSliding  = true;
break;
case MotionEvent.ACTION_MOVE: // 移动
currentX = (int) event.getX();
break;
case MotionEvent.ACTION_UP: // 抬起
isSliding = false;

// 判断当前滑动块, 偏向于哪一边, 如果滑动块的中心点小于背景的中心点, 设置为关闭状态

int bgCenter = switchBG.getWidth() / 2;

boolean state = currentX > bgCenter;// 改变后的状态

// 调用用户的监听事件
if(state != currentState && mListener != null) {
mListener.onToggleStateChanged(state);
}


currentState = state;
break;
default:
break;
}


invalidate(); // 刷新当前控件, 会引起onDraw方法的调用
return true;
}


/**
* 初始化图片
*/
private void initBitmap() {
slideButtonBG = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button_background);
switchBG = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
}


/**
* 设置开关的状态
* @param b
*/
public void setToggleState(boolean b) {
currentState = b;
}


/**
* 设置开关状态改变的监听事件
* @param listener
*/
public void setOnToggleStateChangedListener(OnToggleStateChangedListener listener) {
this.mListener = listener;
}
}




/**
 * 开关状态改变的监听事件
 */
public interface OnToggleStateChangedListener {


/**
* 当开关的状态改变时回调此方法
* @param state 当前开关最新的状态
*/
void onToggleStateChanged(boolean state);
}


布局文件
<com.lcj.slidingbutton.view.SlidingButton
        android:id="@+id/sb_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶思念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值