android滑动开关自己实现



主要思路就是使用两张图片,当用户按钮按钮的图片的时候,滑动到左右的图片之后,就会产生位置的偏差,这个时候就可以切换图片的位置即可


上代码:


View的界面类:

package com.ljz.ps.view;


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;
import android.view.View.OnTouchListener;


public class MySlipSwitch extends View  implements OnTouchListener
{
//状态开、关、按钮的图片资源
private Bitmap switch_on_BKG,switch_off_BKG,slip_Btu;

//当前位置,手指按下水平位置
private float currenX,previousX;

//是否正在滑动
private boolean isSlipping = false;

//当前滑动开关状态
private boolean isSwitchState = false;

//按钮开启
private Rect on_Rect;

//按钮关闭
private Rect off_Rect;

//滑动事件响应接口
private OnSwitchListener onSwitchListener;
//是否开启滑动事件响应
private boolean isOnswichListener = false;



/**
* 类的构造方法
* @param context
*/
public MySlipSwitch(Context context)
{
super(context);
//注册开启事件
setOnTouchListener(this);
}

public MySlipSwitch(Context context, AttributeSet attrs)
{
super(context, attrs);
//注册开启事件
setOnTouchListener(this);
}



/**
* @param onSwitchListener
* @description 注册响应事件
* @version 1.0
* @author ljz
* @update 2012-5-3 下午8:36:13
* @throws
*/
public void setOnSwitchListener( OnSwitchListener onSwitchListener )
{
this.onSwitchListener = onSwitchListener;
isOnswichListener = true;
}


/**
* @param switchOnBkg
* @param switchOffBkg
* @param slipBtn
* @description 设置资源文件和开关按钮初始化
* @version 1.0
* @author ljz
* @update 2012-5-3 下午8:37:42
* @throws
*/
public void setImageResource(int switchOnBkg, int switchOffBkg,int slipBtn)
{
//开启按钮、关闭按钮、按钮
switch_on_BKG = BitmapFactory.decodeResource(getResources(), switchOnBkg);
switch_off_BKG = BitmapFactory.decodeResource(getResources(), switchOffBkg);
slip_Btu = BitmapFactory.decodeResource(getResources(), slipBtn);

//开启按钮是所在位置的矩形(左)
on_Rect = new Rect( 0, 0, slip_Btu.getWidth(), slip_Btu.getHeight());

//关闭按钮是所在位置的矩形(右)
off_Rect = new Rect(slip_Btu.getWidth(), 0, switch_on_BKG.getWidth(), switch_on_BKG.getHeight());
}


//获得当前滑动开关状态
public boolean getSwitchState()
{
return isSwitchState;
}


//设置当前滑动开关状态,并且刷新界面
public void setSwitchState(boolean isSwitchState)
{
this.isSwitchState = isSwitchState;
invalidate();
}


@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);

Paint paint = new Paint();
Matrix matrix = new Matrix();

//画出开关
canvas.drawBitmap(switch_on_BKG, matrix, paint);

// System.out.println("------------你没!!!!!------------------");
// System.out.println("switch_on_BKG.getWidth()="+switch_on_BKG.getWidth());
// System.out.println("switch_on_BKG.getHeight()="+switch_on_BKG.getHeight());
// System.out.println("------------你没!!!!!------------------");

// 滑动按钮的左边坐标
float left_SlipBtn;
if( isSlipping )
{
//正在滑动
if( currenX > switch_off_BKG.getWidth() )
{
left_SlipBtn = switch_on_BKG.getWidth() - slip_Btu.getWidth();
}
else
{
left_SlipBtn =  currenX - slip_Btu.getWidth() / 2;
}
}
else
{
// 根据当前的开关状态设置滑动按钮的位置
if (isSwitchState)
{
left_SlipBtn = on_Rect.left;

}
else
{
left_SlipBtn = off_Rect.left;
}
// System.out.println("left_SlipBtn = " + left_SlipBtn);
}
// 对滑动按钮的位置进行异常判断
if (left_SlipBtn < 0)
{
left_SlipBtn = 0;
}
else if (left_SlipBtn > switch_on_BKG.getWidth() - slip_Btu.getWidth())
{
left_SlipBtn = switch_on_BKG.getWidth() - slip_Btu.getWidth();
}
canvas.drawBitmap(slip_Btu, left_SlipBtn, 0, paint);
}


//响应OnTouchListener的事件,用户处理滑动、按下、松开的事件
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
//按下
case MotionEvent.ACTION_DOWN:
previousX = event.getX();
currenX = previousX;
isSlipping = true;
break;

//移动
case MotionEvent.ACTION_MOVE:
currenX = event.getX();
break;

//松开
case MotionEvent.ACTION_UP:
isSlipping = false;
// 松开前开关的状态
boolean previousSwitchState = isSwitchState;
if( event.getX() >= (switch_off_BKG.getWidth()/2)  )
{
isSwitchState = false;
}
else
{
isSwitchState = true;
}
// System.out.println("isSwitchState =" + isSwitchState );
// System.out.println("isOnswichListener =" + isOnswichListener );
// System.out.println("previousSwitchState =" + previousSwitchState );
//如果有监听就实现监听
if( isOnswichListener && previousSwitchState != isSwitchState )
{
// System.out.println("???1" );
onSwitchListener.setSwitcListner(isSwitchState);
// System.out.println("???2" );
}
break;
}
invalidate();
return true;
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
//系统调用,告诉父元素,这个UI组件的大小
setMeasuredDimension(switch_off_BKG.getWidth(), switch_off_BKG.getHeight());
}



/**
* @description 状态发生改变的处理方法
* @version 1.0
* @author ljz
* @update 2012-5-3 下午8:30:17
*/
public interface OnSwitchListener
{
/**
* @param onSwitch
* @description 实现这个接口,就可以实现这个UI组件的事件响应
* @version 1.0
* @author ljz
* @update 2012-5-3 下午8:30:38
* @throws
*/
public abstract void setSwitcListner( boolean isSwitch );
}
}


使用:

在界面布局文件上面:

<com.ljz.ps.view.MySlipSwitch
   android:id="@+id/main_myslipswitch"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
   />


代码里面:

//初始化滑动开关
MySlipSwitch slipSwitch = (MySlipSwitch)findViewById(R.id.main_myslipswitch);
slipSwitch.setSwitchState(true);

                //加载图片:第一、第二个一致,第三哥是按钮的滑快
slipSwitch.setImageResource(R.drawable.btu_backgroud1,R.drawable.btu_backgroud1 ,R.drawable.btu_slip);
slipSwitch.setOnSwitchListener(new OnSwitchListener()
{
public void setSwitcListner(boolean isSwitch)
{
if (isSwitch)
{
//代表显示课程
// Toast.makeText(MainFrameActivity.this, "显示课程", 300).show();
g_flag = true;
//响应
changeListModel();
}
else
{
//代表显示事务
// Toast.makeText(MainFrameActivity.this, "显示事务", 300).show();
g_flag = false;
//响应
changeListModel();
}
// System.out.println("flag"+g_flag);
}
});







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值