效果预览:



SlipButton.java
package com.iaiai.activity;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;/** *  * <p> * Title: SlipButton.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2012-9-28 下午4:33:54 * </p> *  * @author 丸子 * @version 0.0.1 */public class SlipButton extends View implements OnTouchListener {public interface OnChangedListener {abstract void OnChanged(String strName, boolean CheckState);}private String strName;private boolean enabled = true;public boolean flag = false;// 设置初始化状态public boolean NowChoose = false;// 记录当前按钮是否打开,true为打开,flase为关闭private boolean OnSlip = false;// 记录用户是否在滑动的变量public float DownX = 0f, NowX = 0f;// 按下时的x,当前的x,NowX>100时为ON背景,反之为OFF背景private Rect Btn_On, Btn_Off;// 打开和关闭状态下,游标的Rectprivate boolean isChgLsnOn = false;private OnChangedListener ChgLsn;private Bitmap bg_on, bg_off, slip_btn;public SlipButton(Context context) {super(context);init();}public SlipButton(Context context, AttributeSet attrs) {super(context, attrs);init();}public void setChecked(boolean fl) {if (fl) {flag = true;NowChoose = true;NowX = 80;} else {flag = false;NowChoose = false;NowX = 0;}}public void setEnabled(boolean b) {if (b) {enabled = true;} else {enabled = false;}}private void init() {// 初始化// 载入图片资源bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.on_btn);bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.off_btn);slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.white_btn);// 获得需要的Rect数据Btn_On = new Rect(0, 0, slip_btn.getWidth(), slip_btn.getHeight());Btn_Off = new Rect(bg_off.getWidth() - slip_btn.getWidth(), 0, bg_off.getWidth(), slip_btn.getHeight());setOnTouchListener(this);// 设置监听器,也可以直接复写OnTouchEvent}@Overrideprotected void onDraw(Canvas canvas) {// 绘图函数super.onDraw(canvas);Matrix matrix = new Matrix();Paint paint = new Paint();float x;{if (flag) {NowX = 80;flag = false;}// bg_on.getWidth()=71if (NowX < (bg_on.getWidth() / 2))// 滑动到前半段与后半段的背景不同,在此做判断canvas.drawBitmap(bg_off, matrix, paint);// 画出关闭时的背景elsecanvas.drawBitmap(bg_on, matrix, paint);// 画出打开时的背景if (OnSlip) {// 是否是在滑动状态,if (NowX >= bg_on.getWidth())// 是否划出指定范围,不能让游标跑到外头,必须做这个判断x = bg_on.getWidth() - slip_btn.getWidth() / 2;// 减去游标1/2的长度...elsex = NowX - slip_btn.getWidth() / 2;} else {// 非滑动状态if (NowChoose)// 根据现在的开关状态设置画游标的位置x = Btn_Off.left;elsex = Btn_On.left;}if (x < 0)// 对游标位置进行异常判断...x = 0;else if (x > bg_on.getWidth() - slip_btn.getWidth())x = bg_on.getWidth() - slip_btn.getWidth();canvas.drawBitmap(slip_btn, x, 0, paint);// 画出游标.}}public boolean onTouch(View v, MotionEvent event) {if (!enabled) {return false;}switch (event.getAction()) {// 根据动作来执行代码case MotionEvent.ACTION_MOVE:// 滑动NowX = event.getX();break;case MotionEvent.ACTION_DOWN:// 按下if (event.getX() > bg_on.getWidth() || event.getY() > bg_on.getHeight())return false;OnSlip = true;DownX = event.getX();NowX = DownX;break;case MotionEvent.ACTION_UP:// 松开OnSlip = false;boolean LastChoose = NowChoose;if (event.getX() >= (bg_on.getWidth() / 2))NowChoose = true;elseNowChoose = false;if (isChgLsnOn && (LastChoose != NowChoose))// 如果设置了监听器,就调用其方法..ChgLsn.OnChanged(strName, NowChoose);break;default:}invalidate();// 重画控件return true;}public void SetOnChangedListener(String name, OnChangedListener l) {// 设置监听器,当状态修改的时候strName = name;isChgLsnOn = true;ChgLsn = l;}}


MainActivity.java
package com.iaiai.activity;import android.app.Activity;import android.os.Bundle;import android.widget.Toast;/** *  * <p> * Title: MainActivity.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2012-9-28 下午4:33:54 * </p> *  * @author 丸子 * @version 0.0.1 */public class MainActivity extends Activity implements SlipButton.OnChangedListener {SlipButton button;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);button = (SlipButton) findViewById(R.id.slipButton);button.SetOnChangedListener("the one", this);// button.setEnabled(false);//设置button不可用button.setChecked(true);// 设置button的初始化状态为打开}@Overridepublic void OnChanged(String strName, boolean CheckState) {if (CheckState) {Toast.makeText(MainActivity.this, strName + " is opened!", Toast.LENGTH_LONG).show();} else {Toast.makeText(MainActivity.this, strName + " is closed!", Toast.LENGTH_LONG).show();}}}


下面是用到的三张图片:


更多相关文章

  1. android media player 状态机
  2. Android 沉浸式状态栏 开源 很好用
  3. android状态栏一体化
  4. Android:获取状态栏高度
  5. Android笔记Android基于事件监听器处理机制
  6. android输入法弹出调整布局与沉浸式状态栏冲突+fitSystemWindows
  7. Android 8.0 状态栏信号显示、信号定制
  8. Android中StateListDrawable的种类(状态的种类)
  9. 沉浸式状态栏的实现

随机推荐

  1. Android(安卓)4 游戏高级编程(第2版)
  2. Android(安卓)Material Design 组件集合D
  3. 安卓缓存-LruCache介绍
  4. [AndroidTips]Android中系统自带的锁:Walk
  5. Android知识要点整理(2)----- 应用资源
  6. Android零散知识点积累
  7. SDK大全2的读书笔记
  8. 如何使用SQLiteOpenHelper
  9. Androidz之clickable
  10. android混淆(Obfuscate)