`
104zz
  • 浏览: 1507796 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
阅读更多

 

在很多时候我们看到在iphone手机应用中都有滑动开启和关闭这个功能,在android40以下的版本中且没有这个功能,但是android手机在使用的多是4.0以下的系统,所以为了满足需求,我们自己设计自定的滑动开启和关闭按钮。

 

 

第一步:创建一个打开关闭的状态接口函数OnChangedListener主要创建一个打开关闭状态的抽象方法OnChanged(boolean CheckState),本接口主要是用于空间跟activity之间的状态回调,代码如下:

 

 

public interface  OnChangedListener {  
 abstract void OnChanged(boolean CheckState);
}
 

第二步:创建SlipButton类继承View类(基本上android的空间都是继承这个类的,所以如果我们想自己设计出好看或者有特别用途的空间都可以继承这个类然后根据需求设计和实现重写相关方法)实现OnTouchListener接口实现手势触控和滑动的控制,本类的实现在代码中有详细的描述,代码如下:

 

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;
import com.example.slidebutton.R;
 
public class SlipButton extends View implements OnTouchListener {
 
    private boolean NowChoose = false;// 记录当前按钮是否打开,true为打,flase为关
    private boolean OnSlip = false;// 记录用户是否在滑动的变量
    private float DownX, NowX;// 按下时的x,当前的x,
    private Rect Btn_On, Btn_Off;// 打开和关闭状态下,游标的Rect
    private boolean isChgLsnOn = false;
    private OnChangedListener ChgLsn; 
    private Bitmap bg_on, bg_off, slip_btn; 
    //此构造函数在直接new控件时调用
    public SlipButton(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        init();
    }
    
    public boolean isChecked(){
    	return NowChoose;
    }
 
    public void setChecked(boolean check){
    	NowChoose = check;
    	invalidate();
    }
    
  //此构造函数在xml中使用控件时调用
    public SlipButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        init();
    }
 
    private void init() {// 初始资源
        // 载入图片资源
        bg_on = BitmapFactory.decodeResource(getResources(),
                R.drawable.images_on);
        bg_off = BitmapFactory.decodeResource(getResources(),
                R.drawable.images_off);
        slip_btn = BitmapFactory.decodeResource(getResources(),
                R.drawable.split_button);
        // 获得�?��的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
    }
 
    
    protected void onDraw(Canvas canvas) {// 绘图函数
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        Matrix matrix = new Matrix();
        Paint paint = new Paint();
        float x;
        {
            if ((NowX < (bg_on.getWidth() / 2))&&!NowChoose)// 滑动到前半段与后半段的背景时在此做判是否关闭或打开
            {
                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) {
        // TODO Auto-generated method stub
        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(NowChoose);
            break;
        default:
 
        }
        invalidate();// 重画控件
        return true;
    }
 
    public void SetOnChangedListener(OnChangedListener l) {// 设置监听?当状态修改的时?
        isChgLsnOn = true;
        ChgLsn = l;
    }
 

 

第三步:设计xml文件(控件的使用也可以直接在activity中直接实例化的如:SlipButton mSlipButton=new SlipButton(this),xml中使用如下:

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <RelativeLayout
        android:id="@+id/setlayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_preference_one_normal"
        android:gravity="center" >
        <TextView
            android:id="@+id/d_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:gravity="center_vertical"
            android:paddingBottom="10dip"
            android:paddingTop="10dip"
            android:singleLine="true"
            android:text="免打扰"
            android:textColor="#000000"
             />
<!--使用SlipButton的方法这里必须是类的包名加.类名  -->
        <com.example.widget.SlipButton
            android:id="@+id/on"
            android:layout_width="60dip"
            android:layout_height="25dip"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="8dip"
            android:layout_marginTop="8dip"
            />
    </RelativeLayout>
</RelativeLayout>
 

 

第四步:编写MainActivity实现OnChangedListener接口,以便于监听打开和关闭时需要处理的事情。代码如下:

 

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import com.example.widget.OnChangedListener;
import com.example.widget.SlipButton;
public class MainActivity extends Activity implements OnChangedListener {
private SlipButton mSlipButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSlipButton = (SlipButton) this.findViewById(R.id.on);
        mSlipButton.SetOnChangedListener(this);//设置事件监听
        
    }
    //这里为开或者关时自己所需要做的动作或实现的内容处理
public void OnChanged(boolean CheckState) {
if (CheckState) {
Toast.makeText(this, "打开了", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "关闭了", Toast.LENGTH_LONG).show();
}
}
    
}
 

 

第五步:运行效果如图:


 

 

第六步附上源码,为有需要的提供下载参考

 

 

  • 大小: 18 KB
1
0
分享到:
评论
5 楼 AA4716171 2013-11-24  
我运行您提供的demo 可以正常滑动,但是我把您提供的SlipButton放在ViewPager里面进行显示没有问题,但是进行左右滑动的话 有点卡的感觉,每次左右滑动的时候都要滑动两次才行.第一次滑动停在中间,第二次滑动才能到左边或者右边.
4 楼 sunjianfei1029 2013-10-10  
楼主 怎么在Android里设置开关的默认设置啊 ? 是调用setChecked(boolean check)方法吗?
3 楼 a184017 2013-10-09  
没效果怎么回事了?
2 楼 还有也许 2013-08-07  
无法下载,郁闷
1 楼 soho123xin 2013-02-21  
很好啊,正是想要的效果

相关推荐

    android自定义滑动按钮

    "android自定义滑动按钮"是一个专题,旨在教你如何在Android平台上创建一个具有滑动手势的开关按钮,这种控件通常用于开启或关闭某个功能,如Wi-Fi、蓝牙等。下面将详细解释这个知识点。 一、自定义滑动按钮的基本...

    Android自定义滑动接听电话控件组

    在Android开发中,自定义滑动接听电话控件组是一种常见的功能实现,它为用户提供了一种直观、便捷的接听电话方式。这样的控件通常由一个显示来电信息的界面和一个可滑动的接听/挂断按钮组成。在这个场景中,我们将...

    安卓 android 自定义 switch button,滑动开关

    最后,为了让自定义`Switch`按钮在不同的设备和Android版本上保持一致的外观和行为,可以使用`style`和`主题`进行适配。在`res/values/styles.xml`中定义自定义样式,并在应用程序的主主题中应用: ```xml &lt;!-- ...

    android 自定义滑动按钮

    在Android开发中,自定义控件是提升应用用户体验和界面设计独特性的重要手段。本教程将探讨如何创建一个自定义的...这个自定义滑动按钮的源码和资源文件(如`huadongBtn.zip`)将使你的Android开发工作更加高效便捷。

    自定义滑动开关和切换按钮

    总的来说,自定义滑动开关和切换按钮涉及到Android的图形绘制、动画处理、事件监听等多个方面,需要对Android SDK有深入的理解。通过自定义,我们可以创造出更符合应用需求的交互体验,提升用户的使用感受。实践中,...

    android自定义圆盘方向按钮

    本教程将深入探讨如何在Android中实现一个自定义的圆盘方向按钮,这个控件可以用于游戏或者其他需要用户进行方向选择的应用场景。我们将讨论如何从头开始构建这样一个自定义控件,包括继承自View类,利用Canvas进行...

    自定义滑动按钮为例图文剖析Android自定义View绘制

    本文将以自定义滑动按钮为例,深入解析Android自定义View的绘制过程。 首先,了解View和ViewGroup的关系至关重要。View是所有UI元素的基础类,它负责绘制和事件处理。而ViewGroup则作为容器,用于管理并布局多个...

    Android自定义开关按钮(滑动,点击)

    本教程将聚焦于自定义开关按钮(Switch Button),一种在移动应用中常见的交互控件,用于切换两种状态,如开启和关闭。我们将讨论如何通过滑动和点击事件来实现这个功能。 首先,自定义开关按钮的基础是继承自`View...

    android 自定义开关按钮

    "android 自定义开关按钮"这个主题就是关于如何在Android应用中创建一个独特且吸引人的开关控件,通常这种开关按钮用于切换功能的开启或关闭,如静音、Wi-Fi等设置。下面我们将深入探讨这一话题。 首先,Android...

    Android自定义滑动按钮

    完整实现了与苹果一模一样的滑动按钮,包括拖动过程中的按钮变化,自由度与苹果完全一样,实时变化样式。已封装好,大家可直接使用,也可看源码进行学习交流。

    android自定义View(五)打造自己的遥控器菜单

    这个过程涉及到了Android自定义View的基本原理,包括绘图、触摸事件处理、动画和布局管理等。了解并掌握这些知识,对于提升Android应用的用户体验具有重要意义。想要了解更多关于Android自定义View的内容,可以访问...

    Android自定义实现可滑动按钮

    本文实例为大家分享了Android自定义实现可滑动按钮的具体代码,供大家参考,具体内容如下 实现逻辑 1.创建一个类继承view类,实现里面的onMeasure() onDraw()方法 2.在 onMeasure() 中需要调用setMeasuredDimension...

    Android自定义Seekbar滑动条 Pop提示跟随滑动按钮滑动

    "Android自定义Seekbar滑动条Pop提示跟随滑动按钮滑动" Android自定义Seekbar滑动条Pop提示跟随滑动按钮滑动是一种常见的交互效果,在Android应用程序中广泛应用。本文将详细介绍如何自定义Seekbar滑动条,实现Pop...

    Android 仿 iPhone 自定义滑动按钮

    在Android开发中,为了实现与iPhone类似的用户体验,开发者经常需要创建自定义的UI组件,其中滑动按钮(Slide Button)就是一个常见的需求。本教程将详细讲解如何在Android中仿制iPhone的滑动开关按钮,让应用程序看...

    Android双向滑动菜单带按钮版

    本文将详细解析"Android双向滑动菜单带按钮版"这一主题,结合标签"Android", "双向滑动", "滑动菜单", "slidemenu"和"特效",以及压缩包中的"BidirSlidingLayout"文件,我们将深入讨论如何实现一个具有双向滑动功能...

    Android自定义软键盘

    总结,创建一个Android自定义软键盘需要对Android的输入法框架有深入理解,涉及到`InputMethodService`、`Keyboard`类以及布局设计等多个方面。通过自定义布局和逻辑,我们可以实现独特的键盘样式和交互效果,满足...

    自定义滑动按钮toogleButton

    在Android开发中,自定义...总之,自定义滑动按钮ToggleButton是一种提高Android应用界面品质的方式,通过深入理解Android的视图系统和动画机制,开发者可以创造出符合自己应用风格的交互元素,提供更优秀的用户体验。

    Android自定义相机——身份证扫描界面

    综上所述,创建一个Android自定义相机身份证扫描界面涉及多个步骤,包括权限管理、相机API的使用、自定义布局设计、手势识别、图像处理等技术。通过对这些知识点的掌握和实践,你可以为用户提供一个高效且准确的...

Global site tag (gtag.js) - Google Analytics