效果图:
自定义Button类:
public class ToggleButton extends View {
private Bitmap switchBkgOn;
private Bitmap switchBkgOff;
private Bitmap slipBtn;
private float currentX;//当前x轴坐标
private boolean isSlipping = false;//当前开关是否可以滑动
private float left_slip; //记录滑动块左边的位置
private boolean isSwitchOn = true;// 记录当前开关的状态
private OnSwitchStateChangeListener switchStateChangeListener;//开关监听器
private boolean proSwitchOn = true;// 上一次开关的状态
public ToggleButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public ToggleButton(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public ToggleButton(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
//开关的样式
public void setToggleButtonStyle(int switch_bkg_on, int switch_bkg_off, int slip_btn) {
//生成开关样式图片
//开启的背景图片
switchBkgOn = BitmapFactory.decodeResource(getResources(), switch_bkg_on);
//关闭的背景图片
switchBkgOff = BitmapFactory.decodeResource(getResources(), switch_bkg_off);
//滑动块的背景图片
slipBtn = BitmapFactory.decodeResource(getResources(), slip_btn);
}
//测量控件的尺寸大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
//super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//设置尺寸大小
setMeasuredDimension(switchBkgOn.getWidth(), switchBkgOn.getHeight());
}
//绘制控件
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制背景
Matrix matrix = new Matrix();//设置控件的样式
Paint paint = new Paint(); //画笔
//根据滑动块的位置 来设置背景图片
if(currentX > switchBkgOn.getWidth()/2){
//滑动块在右边, 开关处于开启状态
canvas.drawBitmap(switchBkgOn, matrix, paint);
} else {
//滑动块在左边, 开关处于关闭状态
canvas.drawBitmap(switchBkgOff, matrix, paint);
}
//-------------------------------------------
//绘制滑动块
left_slip = 0;//记录滑动块左边的位置
if(isSlipping){//滑动状态
//动态的设置滑动块位置
if(currentX > switchBkgOn.getWidth()){
left_slip = switchBkgOn.getWidth() - slipBtn.getWidth();
} else {
left_slip = currentX - slipBtn.getWidth()/2;
}
} else{//非滑动状态
//根据开关的状态 ,来指定滑动块的位置
if(isSwitchOn){
left_slip = switchBkgOn.getWidth() - slipBtn.getWidth();
} else {
left_slip = 0;
}
}
//为left_slip左边处理
if(left_slip < 0){
left_slip = 0;
} else if(left_slip > switchBkgOn.getWidth() - slipBtn.getWidth()){
left_slip = switchBkgOn.getWidth() - slipBtn.getWidth();
}
//绘制
canvas.drawBitmap(slipBtn, left_slip, 0, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
currentX = event.getX();
//允许滑动
isSlipping = true;
break;
case MotionEvent.ACTION_MOVE:
//更新滑动块位置
currentX = event.getX();
break;
case MotionEvent.ACTION_UP:
//不允许滑动
isSlipping = false;
if(currentX > switchBkgOff.getWidth()/2){
//滑动块在右边 开关为开启状态
isSwitchOn = true;
} else {
//滑动块在左边 开关为关闭状态
isSwitchOn = false;
}
if( isSwitchOn != proSwitchOn && switchStateChangeListener !=null){
switchStateChangeListener.onSwitch(isSwitchOn);
//更新proSwitchOn状态
proSwitchOn = isSwitchOn;
}
break;
}
invalidate();//实现页面(开关)重绘
return true;
}
//开关的默认状态
public void setSwitchState(boolean state) {
isSwitchOn = state;
}
//-------------------------------
interface OnSwitchStateChangeListener{
abstract void onSwitch(boolean state);
}
//提供一个回调方法
public void setOnSwitchStateChangeListener(OnSwitchStateChangeListener listener){
switchStateChangeListener = listener;
}
}
布局文件:
主类:
public class MainActivity extends Activity {
private ToggleButton toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toggle = (ToggleButton) findViewById(R.id.toggle);
//开关的样式
toggle.setToggleButtonStyle(R.drawable.bkg_switch,R.drawable.bkg_switch, R.drawable.btn_slip);
//开关的默认状态
toggle.setSwitchState(true);
//添加开关监听器 来实现功能的开启或关闭
toggle.setOnSwitchStateChangeListener(new OnSwitchStateChangeListener() {
@Override
public void onSwitch(boolean state) {
//根据开关状态, 来实现功能的开启或关闭
if(state){
Toast.makeText(getApplicationContext(), "开关开启", 0).show();
} else {
Toast.makeText(getApplicationContext(), "开关关闭", 0).show();
}
}
});
}
}