Android开发之自定义控件-自定义Button

效果图:
 
自定义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();
				}
			}
		});
		
	}


}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值