主要思路就是使用两张图片,当用户按钮按钮的图片的时候,滑动到左右的图片之后,就会产生位置的偏差,这个时候就可以切换图片的位置即可
上代码:
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);
}
});