自定义view — Toggle开关

mainActivity

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		ToggleView tv_test = (ToggleView) findViewById(R.id.tv_test);
		boolean toggleOn = tv_test.isToggleOn();
		//处理事件
		tv_test.setOnToggleChangeListener(new OnToggleChangeListener() {
			
			@Override
			public void onToggleChanged(ToggleView toggleView, boolean isToggleOn) {
				// TODO Auto-generated method stub
				//自己处理
				if (isToggleOn) {
					Toast.makeText(getApplicationContext(), "开关打开了", 0).show();
				} else {
					Toast.makeText(getApplicationContext(), "开关关闭了", 0).show();
				}
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
	
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


Toogleview

public class ToggleView extends View {

	private Bitmap mBitmapBackgroud;
	private Bitmap mBitmapButton;
	private Paint mPaint;
	private float downOrMoveOrUpX;

	private static final int STATE_DOWN = 1; // 按下
	private static final int STATE_MOVE = 2; // 移动
	private static final int STATE_UP = 3; // 松开

	private int current_State = STATE_DOWN;// 0 记录事件的状态
	
	private boolean isToggleOn = false;//记录开关的状态
	
	private OnToggleChangeListener mOnToggleChangeListener;
	//事件回调声明
	public interface OnToggleChangeListener {
		public void onToggleChanged(ToggleView toggleView, boolean isToggleOn);
	}
	
	public void setOnToggleChangeListener(OnToggleChangeListener listener) {
		this.mOnToggleChangeListener = listener;
	}
	
	/**
	 * @return
	 *    当前开关的状态
	 */
	public boolean isToggleOn(){
		return isToggleOn;
	}

	public ToggleView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		initView();

		mPaint = new Paint();
	}

	private void initView() {
		// 获取两张图片
		// 按钮的背景图片
		mBitmapBackgroud = BitmapFactory.decodeResource(getResources(),
				R.drawable.switch_background);

		// 滑块
		mBitmapButton = BitmapFactory.decodeResource(getResources(),
				R.drawable.slide_button_background);

	}

	public ToggleView(Context context) {
		this(context, null);
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// 控件的大小 为 背景图片的大小
		setMeasuredDimension(mBitmapBackgroud.getWidth(),
				mBitmapBackgroud.getHeight());
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// 添加触摸事件
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			// 按下
			downOrMoveOrUpX = event.getX();
			current_State = STATE_DOWN;
		case MotionEvent.ACTION_MOVE:
			// 移动
			downOrMoveOrUpX = event.getX();
			current_State = STATE_MOVE;
			break;
		case MotionEvent.ACTION_UP:
			//松开
			downOrMoveOrUpX = event.getX();    
			current_State = STATE_UP;
			//判断
			if (downOrMoveOrUpX < mBitmapBackgroud.getWidth()/2 && isToggleOn) {
				//左一半
				isToggleOn = false;
				//调用回调接口
				if (mOnToggleChangeListener != null) {
					mOnToggleChangeListener.onToggleChanged(this, isToggleOn);
				}
			} else if (downOrMoveOrUpX >= mBitmapBackgroud.getWidth()/2 && !isToggleOn){
				isToggleOn = true;
				//调用回调接口
				if (mOnToggleChangeListener != null) {
					mOnToggleChangeListener.onToggleChanged(this, isToggleOn);
				}
			}
			
			
			
			break;
		default:
			break;
		}

		invalidate();// 触发onDraw方法调用
		return true;// 自己消费掉事件
	}

	@Override
	protected void onDraw(Canvas canvas) {

		// 绘制背景
		canvas.drawBitmap(mBitmapBackgroud, 0, 0, mPaint);

		// 绘制button
		if (current_State == STATE_DOWN || current_State == STATE_MOVE) {
			if (downOrMoveOrUpX < mBitmapButton.getWidth() / 2) {
				// 不用绘制 左边界
				canvas.drawBitmap(mBitmapButton, 0, 0, mPaint);
			} else if (downOrMoveOrUpX > (mBitmapBackgroud.getWidth() - mBitmapButton
					.getWidth() / 2)) {
				// 右边界
				canvas.drawBitmap(mBitmapButton, mBitmapBackgroud.getWidth()
						- mBitmapButton.getWidth(), 0, mPaint);
			} else {
				// 绘制
				float left = downOrMoveOrUpX - mBitmapButton.getWidth() / 2;
				canvas.drawBitmap(mBitmapButton, left, 0, mPaint);
			}
		} else if (current_State == STATE_UP) {
			
			//松开
			//1. 左一半
			if (isToggleOn) {
				//打开
				// 右边界
				canvas.drawBitmap(mBitmapButton, mBitmapBackgroud.getWidth()
						- mBitmapButton.getWidth(), 0, mPaint);
			} else {
				//关闭
				canvas.drawBitmap(mBitmapButton, 0, 0, mPaint);
			}
			//2. 右一半
		}

		super.onDraw(canvas);
	}

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值