您的位置:首页 > 移动开发 > Android开发

android滑动开关自己实现

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

上代码:

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);

}

});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: