`
iaiai
  • 浏览: 2204673 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 滑动开关控件

 
阅读更多
效果预览:



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;// 打开和关闭状态下,游标的Rect

	private 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
	}

	@Override
	protected 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()=71
			if (NowX < (bg_on.getWidth() / 2))// 滑动到前半段与后半段的背景不同,在此做判断
				canvas.drawBitmap(bg_off, matrix, paint);// 画出关闭时的背景
			else
				canvas.drawBitmap(bg_on, matrix, paint);// 画出打开时的背景

			if (OnSlip) {// 是否是在滑动状态,
				if (NowX >= bg_on.getWidth())// 是否划出指定范围,不能让游标跑到外头,必须做这个判断
					x = bg_on.getWidth() - slip_btn.getWidth() / 2;// 减去游标1/2的长度...
				else
					x = NowX - slip_btn.getWidth() / 2;
			} else {// 非滑动状态
				if (NowChoose)// 根据现在的开关状态设置画游标的位置
					x = Btn_Off.left;
				else
					x = 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;
			else
				NowChoose = 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;

	@Override
	public 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的初始化状态为打开
	}

	@Override
	public 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();
		}
	}

}


下面是用到的三张图片:


  • 大小: 2.6 KB
  • 大小: 2.7 KB
  • 大小: 7.7 KB
  • 大小: 7.9 KB
  • 大小: 4.8 KB
分享到:
评论
5 楼 阿顺顺 2013-05-07  
经验证,不能嵌套使用!!不知道怎么改!!  
4 楼 gsmhb2005 2013-01-17  
楼主这个貌似不能嵌套使用?
3 楼 celia01 2012-12-28  
请问,android有自带的开关空间吗?android2.3.3
2 楼 newfido 2012-11-16  
xuehaibo08 写道
这里面的main.xml文件能帖给我吗?我用了你的代码出现类载入出现异常

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
    
    <com.dem.SlipButton 
        android:id="@+id/slipButton"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />
    

</LinearLayout>
1 楼 xuehaibo08 2012-10-22  
这里面的main.xml文件能帖给我吗?我用了你的代码出现类载入出现异常

相关推荐

    Android自定义控件之滑动开关

    本篇文章将深入探讨如何在Android中创建一个自定义的滑动开关控件。 首先,我们需要了解滑动开关的基本构成。滑动开关通常由两部分组成:一个可滑动的轨道(track)和一个滑块(thumb),用户通过拖动滑块在轨道上...

    Android自定义控件之实现滑动选择开关代码

    本教程将深入探讨如何实现一个滑动选择开关(Slide Switch)的自定义控件,该控件通常用于开启或关闭某个功能,如开启蓝牙、Wi-Fi等。 首先,我们需要创建一个新的Java类,继承自Android的`View`类或者`...

    android之自定义开关控件

    "android之自定义开关控件"这个主题旨在教你如何在Android平台上创建一个类似苹果iOS Toggle的自定义开关组件。以下是对这个主题的详细讲解: 一、基础知识 在Android中,开关系列的控件主要包括Switch和...

    android自定义控件滑动开关源码

    这篇博客文章的配套源码提供了一个自定义滑动开关的实现,让我们深入探讨这个自定义控件的设计和实现。 首先,滑动开关的基本原理是利用Android的View类或者CompoundButton类进行扩展。在这个例子中,开发者可能...

    android自定义开关控件

    本文将深入探讨如何使用Android自定义View来实现一个仿iOS风格的开关控件。首先,我们需要了解自定义View的基本流程和关键组件。 一、自定义View基础 自定义View通常涉及到以下步骤: 1. 创建一个新的类,继承自`...

    Android自定义滑动开关

    总之,自定义Android滑动开关是一个涉及UI绘制、触摸事件处理和状态管理的过程。通过这种方式,开发者可以创造出符合项目需求的独特组件,提高应用程序的用户体验。提供的资源链接提供了更详细的实现步骤和演示,...

    Android之实现滑动开关组件

    在Android开发中,滑动开关(Switch)是一种常见的UI组件,用于用户进行二选一的选择,比如开启或关闭某个功能。本教程将深入探讨如何在Android应用中实现滑动开关组件,包括基本使用、自定义样式以及事件监听。 ...

    Android滑动开关按钮

    在Android开发中,滑动开关按钮(Slider或Switch)是一种常用的UI组件,它允许用户通过简单的左右滑动来切换两种状态,通常用作开/关选项。本篇将深入探讨如何在Android应用中实现苹果风格的滑动开关按钮。 首先,...

    android 滑动开关

    滑动开关在Android SDK中被定义为`SwitchCompat`或`Switch`控件,根据不同的设计风格,开发者可以选择使用Material Design的`SwitchCompat`或原生的`Switch`。 **滑动开关的基本使用** 1. **添加依赖**:如果你...

    qt5仿安卓苹果自定义滑动开关控件.rar

    本示例提供的"qt5仿安卓苹果自定义滑动开关控件.rar"就是一个这样的实践,它实现了类似Android和iOS系统中的滑动开关(Slider或Switch)组件,能够清晰地显示开关的状态,并且通过使用定时器来控制滑动动画,增加了...

    android 滑动开关 SlipButton

    在Android开发中,滑动开关...总结来说,Android滑动开关SlipButton的实现涉及到了自定义View的绘制、触摸事件处理、动画效果以及状态管理等多个方面,通过这样的定制,我们可以创建出既美观又符合用户习惯的交互控件。

    仿IOS适用Android的滑动开关

    在Android开发中,为了提供与iOS相似的用户体验,开发者经常需要创建自定义控件来实现特定的交互效果,比如仿iOS的滑动开关。本文将深入探讨如何在Android平台上实现这样一个仿iOS风格的滑动开关(Slide Switch)。 ...

    Android 滑动开关按钮源码.rar

    在本压缩包"Android 滑动开关按钮源码.rar"中,很可能包含了一个自定义的滑动开关控件的实现代码。下面我们将深入探讨滑动开关在Android中的工作原理、设计与自定义,以及如何在实际项目中应用。 1. **滑动开关的...

    Android 滑动开关按钮源码

    在Android SDK中,滑动开关被称为`Switch`控件,自Android API Level 14(ICS,Ice Cream Sandwich)起作为系统自带组件引入。它的外观和行为可以通过XML属性或代码动态设置。例如,你可以通过以下XML代码创建一个...

    Android 自定义滑动开关

    首先,滑动开关在Android中通常由Switch或CompoundButton类来实现,但我们为了满足特定需求,需要创建一个自定义的View类。创建一个新的Java类,继承自CompoundButton,因为这个类已经包含了开关的基本行为和回调...

    android制作仿iphone开关控件

    在Android原生系统中,开关控件通常是`Switch`或`ToggleButton`,但它们的样式与iOS的滑动开关(UISwitch)有所不同。为了达到仿iPhone的效果,我们需要自定义一个视图组件。 1. **自定义View组件**: - 创建一个...

    自定义可点击可滑动的开关控件

    通过以上步骤,我们可以创建一个功能完备且可定制的滑动开关控件。这个控件不仅可以直接应用于项目中,也可以作为一个基础,根据设计需求调整样式和动画效果。在实际开发过程中,可以参考提供的"开关按钮"资源文件...

    Android 滑动开关按钮源码.zip

    我们将详细探讨滑动开关在Android中的工作原理,以及如何通过源码来理解和定制此类控件。 1. **滑动开关组件介绍** - Android中的滑动开关是`Switch`控件,属于`CompoundButton`家族,继承自`ToggleButton`。它...

    android滑动开关按钮.zip

    在本压缩包文件"android滑动开关按钮.zip"中,我们很可能是找到了关于如何在Android应用中实现自定义滑动开关的相关代码和资源。 首先,Android系统提供了默认的`SwitchCompat`或`Switch`组件,它位于`androidx....

Global site tag (gtag.js) - Google Analytics