android 自定义开关 2段开关 3段开关 两段开关 三段开关*

android 自定义开关2段开关 3段开关

两段开关

package com.sun.myswitchdemo;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.RelativeLayout;


/**
 * 自定义switch
 * 
 * @author sms
 * 
 */
public class SwitchView2 extends RelativeLayout {
	private ImageView maskImage;              // 开关遮盖图片
	private boolean open;                     // 开关当前状态
	private boolean isAninFinish = true;      // 动画是否结束
	private float x;                          // 记录ACTION_DOWN时候的横坐标
	private boolean isChangedByTouch = false; // 是否在一次事件中已经切换过状态
	private OnSwitchChangeListener switchChangeListener; // 监控开关状态

	public interface OnSwitchChangeListener {
		void onSwitchChanged(int state);
	}

	public SwitchView2(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public SwitchView2(Context context) {
		super(context);
		init();
	}

	private void init() {
		setBackgroundResource(R.mipmap.img_switch_bg);
		maskImage = new ImageView(getContext());
		maskImage.setImageResource(R.mipmap.img_switch_thumb);
		addView(maskImage);
	}

	public void setBg(int resid){
		if(maskImage != null){
			maskImage.setImageResource(resid);
		}
		postInvalidate();
	}

	public boolean getSwitchStatus() {
		return open;
	}


	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		maskImage.setLayoutParams(new LayoutParams(this.getWidth() / 2, ViewGroup.LayoutParams.MATCH_PARENT));
	}

	public void setSwitchStatus(boolean isOpen) {
		this.open = isOpen;
		if (isOpen) {
			setGravity(Gravity.RIGHT);
		} else {
			setGravity(Gravity.LEFT);
		}
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN: {
			x = event.getX();
			break;
		}
		case MotionEvent.ACTION_MOVE: {
			if (event.getX() - x > 5 && !open) { // 向右
				changeStatus();
			} else if (event.getX() - x < -5 && open) { // 向左
				changeStatus();
			}
			break;
		}
		case MotionEvent.ACTION_UP: {
			if (Math.abs(event.getX() - x) <= 5) {
				changeStatus();
			}
			isChangedByTouch = false;
			break;
		}
		case MotionEvent.ACTION_CANCEL: {
			isChangedByTouch = false;
			break;
		}
		}
		return true;
	}
	
	private void changeStatus() {
		if (isAninFinish && !isChangedByTouch) {
			isChangedByTouch = true;
			open = !open;
			isAninFinish = false;
			if (switchChangeListener != null) {
				if(open){
					switchChangeListener.onSwitchChanged(3);
				}else{
					switchChangeListener.onSwitchChanged(1);
				}
			}
			changeOpenStatusWithAnim(open);
		}
	}

	



	public OnSwitchChangeListener getSwitchChangeListener() {
		return switchChangeListener;
	}

	public void setOnSwitchChangeListener(OnSwitchChangeListener switchChangeListener) {
		this.switchChangeListener = switchChangeListener;
	}
	
}


三段开关

package com.sun.myswitchdemo;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.RelativeLayout;


/**
 * 自定义switch
 * 
 * @author sms
 * 
 */
public class SwitchView3 extends RelativeLayout {
	private ImageView maskImage;              // 开关遮盖图片
	private  int open = 1;                     // 开关当前状态
	private boolean isAninFinish = true;      // 动画是否结束
	private float x;                          // 记录ACTION_DOWN时候的横坐标
	private boolean isChangedByTouch = false; // 是否在一次事件中已经切换过状态
	private OnSwitchChangeListener switchChangeListener; // 监控开关状态

	public interface OnSwitchChangeListener {
		void onSwitchChanged(int state);
	}

	public SwitchView3(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public SwitchView3(Context context) {
		super(context);
		init();
	}

	private void init() {
		setBackgroundResource(R.mipmap.img_three_switch_bg);
		maskImage = new ImageView(getContext());
		maskImage.setImageResource(R.mipmap.img_three_swtich_thumb);
		addView(maskImage);
	}

//	public boolean getSwitchStatus() {
//		return open;
//	}


	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		maskImage.setLayoutParams(new LayoutParams(this.getWidth() / 3, ViewGroup.LayoutParams.MATCH_PARENT));
	}

//	public void setSwitchStatus(boolean isOpen) {
//		this.open = isOpen;
//		if (isOpen) {
//			setGravity(Gravity.RIGHT);
//		} else {
//			setGravity(Gravity.LEFT);
//		}
//	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN: {
			x = event.getX();
			break;
		}
		case MotionEvent.ACTION_MOVE: {
			if (event.getX() - x > 5 && open != 3) { // 向右
				changeStatus(1);
			} else if (event.getX() - x < -5 && open != 1) { // 向左
				changeStatus(0);
			}
			break;
		}
		case MotionEvent.ACTION_UP: {
			if (Math.abs(event.getX() - x) <= 5) {
				if(open == 1){
					changeStatus(1);
				}else if(open == 3){
					changeStatus(0);
				}else if(open == 2){
					if(x < this.getWidth() / 3){
						changeStatus(0);
					}else if(x > this.getWidth() - (this.getWidth() / 3)){
						changeStatus(1);
					}
				}
			}
			isChangedByTouch = false;
			break;
		}
		case MotionEvent.ACTION_CANCEL: {
			isChangedByTouch = false;
			break;
		}
		}
		return true;
	}
	
	private void changeStatus(int fx) {
		if (isAninFinish && !isChangedByTouch) {
			isChangedByTouch = true;
			if(open == 1){
				open = 2;
				changeOpenStatusWithAnim("12");
			}else if(open == 3){
				open = 2;
				changeOpenStatusWithAnim("32");
			}else if(open == 2){
				if(fx == 1){
					open = 3;
					changeOpenStatusWithAnim("23");
				}else if(fx == 0){
					open = 1;
					changeOpenStatusWithAnim("21");
				}
			}
			isAninFinish = false;
			if (switchChangeListener != null) {
				switchChangeListener.onSwitchChanged(open);
			}
		}
	}

	
	public OnSwitchChangeListener getSwitchChangeListener() {
		return switchChangeListener;
	}

	public void setOnSwitchChangeListener(OnSwitchChangeListener switchChangeListener) {
		this.switchChangeListener = switchChangeListener;
	}
}

附 DEMO地址 https://download.csdn.net/download/qq_37630270/87971141

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐