ToggleButton .java
public class ToggleButton extends View{
private ToggleState toggleState;
private Bitmap switchBg;
private Bitmap slideBg;
private int currentX;
private boolean isSliding = false;
public ToggleButton(Context context) {
super(context);
}
public ToggleButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setToggleState(ToggleState toggleState) {
this.toggleState = toggleState;
}
public enum ToggleState{
Open,Close
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(switchBg.getWidth(), switchBg.getHeight());
}
@Override
protected void onDraw(Canvas canvas) {
int left = 0;
canvas.drawBitmap(switchBg,0,0,null);
if(isSliding){
left = currentX-slideBg.getWidth()/2;
if(left<0){
left = 0;
}else if(left>switchBg.getWidth()-slideBg.getWidth()){
left = switchBg.getWidth()-slideBg.getWidth();
}
}else{
if(toggleState == ToggleState.Open){
left = switchBg.getWidth()-slideBg.getWidth();
}else{
left = 0;
}
}
canvas.drawBitmap(slideBg,left,0,null);
}
public void setSlideBackgroundResource(int slideBackgroundResource) {
switchBg = BitmapFactory.decodeResource(getResources(), slideBackgroundResource);
}
public void setSwitchBackgroundResource(int switchBackgroundResource) {
slideBg = BitmapFactory.decodeResource(getResources(), switchBackgroundResource);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
currentX = (int) event.getX();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN :
isSliding = true;
break;
case MotionEvent.ACTION_MOVE :
break;
case MotionEvent.ACTION_UP :
isSliding = false;
if(currentX<switchBg.getWidth()/2){
if(toggleState != ToggleState.Close){
toggleState = ToggleState.Close;
if(listener!=null){
listener.OnToggleStateChange(toggleState);
}
}
}else{
if(toggleState != ToggleState.Open){
toggleState = ToggleState.Open;
if(listener!=null){
listener.OnToggleStateChange(toggleState);
}
}
}
break;
}
invalidate();
return true;
}
public void setOnToggleStateChangeListener(OnToggleStateChangeListener listener) {
this.listener = listener;
}
private OnToggleStateChangeListener listener;
public interface OnToggleStateChangeListener{
public void OnToggleStateChange(ToggleState toggleState);
}
}
MainActivity.java
public class MainActivity extends Activity {
private ToggleButton toggleBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toggleBtn = (ToggleButton) findViewById(R.id.toggleBtn);
toggleBtn.setSlideBackgroundResource(R.drawable.switch_background);
toggleBtn.setSwitchBackgroundResource(R.drawable.slide_button);
toggleBtn.setToggleState(ToggleButton.ToggleState.Close);
toggleBtn.setOnToggleStateChangeListener(new ToggleButton.OnToggleStateChangeListener() {
@Override
public void OnToggleStateChange(ToggleButton.ToggleState toggleState) {
Toast.makeText(MainActivity.this, toggleState== ToggleButton.ToggleState.Close?"关闭":"开启" , Toast.LENGTH_SHORT).show();
}
});
}
}