【android 自定义开关 2段开关 3段开关 两段开关 三段开关】
自定义开关两段开关三段开关
·
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
更多推荐
已为社区贡献6条内容
所有评论(0)