package com.duguang.baseanimation.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* 自定义滑动开关
* @author
*
*/
public class SlideToggle extends View {
private Bitmap switch_on_bkg;
private Bitmap switch_off_bkg;
private Bitmap btn_slip;
private Rect rect_on;
private Rect rect_off;
private boolean isSwitchOn;//记录当前开关的状态
private OnSwitchStateListener switchStateListener;//开关监听器
private boolean isSwitchStateListenerOn = false; // 记录是否使用了开关监听器
private float currentX;
private boolean isSlipping;//记录开关当前是否处于滑动状态
public SlideToggle(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SlideToggle(Context context) {
super(context);
}
/**
* 设置开关样式
* @param bkgSwitchOn 开启的背景图
* @param bkgSwitchOff 关闭的背景图
* @param btnSlip 滑动块
*/
public void setImageResIDs(int bkgSwitchOn, int bkgSwitchOff, int btnSlip) {
switch_on_bkg = BitmapFactory.decodeResource(getResources(), bkgSwitchOn);
switch_off_bkg = BitmapFactory.decodeResource(getResources(), bkgSwitchOff);
btn_slip = BitmapFactory.decodeResource(getResources(), btnSlip);
//记录开关开启状态时 开关的位置
rect_on = new Rect(switch_on_bkg.getWidth() - btn_slip.getWidth(), 0, switch_off_bkg.getWidth(), btn_slip.getHeight());
//记录开关关闭状态时 开关的位置
rect_off = new Rect(0, 0, btn_slip.getWidth(), btn_slip.getHeight());
}
//设置开关当前状态
public void setSwitchState(boolean state) {
isSwitchOn = state;
}
public interface OnSwitchStateListener{
abstract void onSwitch(boolean state);
}
//开关监听器
public void setOnSwitchStateListener(OnSwitchStateListener listener){
switchStateListener = listener;
isSwitchStateListenerOn = true;
}
@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;
//松开前开关的状态
boolean previousSwitchState = isSwitchOn;
if(currentX < switch_off_bkg.getWidth() /2){
isSwitchOn = false;
} else {
isSwitchOn = true;
}
if(isSwitchOn != previousSwitchState && isSwitchStateListenerOn){
switchStateListener.onSwitch(isSwitchOn);
previousSwitchState = isSwitchOn;
}
Logger.d("onTouch", isSwitchOn + ", " + previousSwitchState);
break;
}
invalidate();//页面重新绘制
return true;
// return super.onTouchEvent(event);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(switch_off_bkg.getWidth(), switch_off_bkg.getHeight());
}
//绘制开关
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Logger.e("onTouch onDraw", ""+isSwitchOn);
Matrix matrix = new Matrix();//图片的风格 样式
Paint paint = new Paint();// 图片的效果
//根据开关的状态 ,设置开关的背景图片
if(currentX < switch_off_bkg.getWidth()/2){
//关闭
canvas.drawBitmap(switch_off_bkg, matrix, paint);
} else {
//开启
canvas.drawBitmap(switch_on_bkg, matrix, paint);
}
float left_slip = 0;
if(isSlipping){//处于滑动状态
if(currentX > switch_off_bkg.getWidth()){// 超过背景图片的宽度
left_slip = switch_off_bkg.getWidth() - btn_slip.getWidth();
} else {//中间滑动s
left_slip = currentX - btn_slip.getWidth()/2;
}
} else {//不处于滑动状态
if(isSwitchOn){
//开启
left_slip = rect_on.left;
canvas.drawBitmap(switch_on_bkg, matrix, paint);
} else {
//关闭
left_slip = rect_off.left;
canvas.drawBitmap(switch_off_bkg, matrix, paint);
}
}
if(left_slip < 0){
left_slip = 0;
} else if(left_slip > switch_off_bkg.getWidth() - btn_slip.getWidth()){
left_slip = switch_off_bkg.getWidth() - btn_slip.getWidth();
}
canvas.drawBitmap(btn_slip, left_slip, 0, paint);
}
}