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

滑动开关控件

 
阅读更多
public class SlidButton extends View implements OnTouchListener {  
  
    private boolean nowChoose = false;// 记录当前按钮是否打开,true为打开,false为关闭  
    private boolean onSlip = false;// 记录用户是否在滑动  
    private float downX, nowX; // 按下时的x,当前的x  
    private Rect btn_on, btn_off;// 打开和关闭状态下,游标的Rect  
  
    private boolean isChgLsnOn = false;//是否设置监听  
    private OnChangedListener changedLis;  
  
    private Bitmap bg_on, bg_off, slip_btn;  
  
    public SlidButton(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        init();  
    }  
  
    public SlidButton(Context context) {  
        super(context);  
        init();  
    }  
  
       @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
        // TODO Auto-generated method stub  
        setMeasuredDimension(bg_on.getWidth(), bg_on.getHeight());  
    }  
  
    
  
    private void init() {  
        // 载入图片资源  
        bg_on = BitmapFactory.decodeResource(getResources(),  
                R.drawable.sild_bg_on);  
        bg_off = BitmapFactory.decodeResource(getResources(),  
                R.drawable.sild_bg_off);  
        slip_btn = BitmapFactory.decodeResource(getResources(),  
                R.drawable.sild_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);  
    }  
      
      
    @Override  
    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)) //滑动到前半段与后半段的背景不同,在此做判断  
                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);//画出游标.     
        }  
    }  
  
    @Override  
    public boolean onTouch(View v, MotionEvent event) {  
          
        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))//如果设置了监听器,就调用其方法.  
                    changedLis.OnChanged(nowChoose);  
                break;  
            default:  
                break;  
        }  
        invalidate();  
        return true;  
    }  
  
      
    public void SetOnChangedListener(OnChangedListener l){//设置监听器,当状态修改的时候  
        isChgLsnOn = true;  
        changedLis = l;  
    }  
      
    public interface OnChangedListener {  
        abstract void OnChanged(boolean checkState);  
    }  
}  
分享到:
评论

相关推荐

    Android自定义控件之滑动开关

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

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

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

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

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

    QT纯代码实现滑动开关控件

    开关按钮大家应该很熟悉,在设置里面经常遇到,切换时候的滑动效果比较帅气。通常说的开关按钮,有两个状态:on、off。大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度要求比较高,...

    vb6 左右滑动开关控件源码

    vb6 控件源码,左右滑动开关,代码实现简单清晰 适用场景 1.基本满足checkbox业务需求 2.状态显示 当前版本功能描述 1.只添加了onClick事件 2.主题颜色修改 3.自适应控件大小

    高仿IOS滑动开关按钮

    iOS系统中的滑动开关设计简洁、直观,而“Android超炫自定义滑动开关控件”则是在Android平台上对这种设计的再现。 实现这个自定义控件通常需要以下步骤: 1. **绘制图形**:首先,你需要设计开关的两种状态,即...

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

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

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

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

    自定义View控件的总结(自定义滑动开关)

    本文将深入探讨如何创建一个自定义的滑动开关控件,通过一个实际的案例——`ToggleButton`,来总结自定义View控件的编写流程。我们将讨论以下几个关键步骤: 1. **基础准备**:首先,我们需要创建一个新的Java类,...

    滑动开关按钮.zip

    这个"滑动开关按钮.zip"文件看起来是一个Android应用的压缩包,包含了与一个名为"MySlipSwitch"的自定义滑动开关控件相关的资源和代码。 首先,我们可以看到这个应用的版本号为0.2,这表明它可能是一个早期开发阶段...

    Android 滑动开关按钮源码.rar

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

    Android中滑动开关的实现

    在Android开发中,为了提供与iOS类似的用户体验,我们...通过上述步骤,开发者可以创建出具有良好用户体验的滑动开关控件。在实际项目中,还可以根据需求进一步扩展,例如增加开关状态的动态改变、滑动速度检测等功能。

    WPF XAML语言实现滑动开关示例

    自己用WPF的XAML语言写的一个类似于苹果手机上的滑动按钮的开关,可以直接使用,程序比较简单易懂,没有任何生涩的引用,涉及WPF的资源定义,控件布局,模板自定义,事件触发,动画实现等基本知识,只是新手学习如何...

    android之自定义开关控件

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

    安卓Android源码——滑动开关按钮.rar

    本资源提供了关于安卓滑动开关按钮的源码,可以帮助开发者深入理解其工作原理,并自定义自己的滑动开关控件。 滑动开关按钮在安卓系统中主要由`Switch`类或者`ToggleButton`类实现,它们都是`CompoundButton`的子类...

    Android代码-滑动开关按钮源码.zip

    6. **XML布局**:在布局文件中添加自定义滑动开关控件,并设置相关属性,如宽度、高度、颜色、初始状态等。 7. **交互逻辑**:在Activity或Fragment中获取滑动开关实例,绑定监听器,根据开关状态执行相应的业务...

    WPF 样式 style 滑动开关 实现的效果像checkbo好看的开关一样

    这里我们关注的是如何使用样式(style)来创建一个滑动开关,这种开关通常被称为ToggleSwitch,其视觉效果类似于传统的复选框(checkbox),但提供了更直观的开/关操作体验。 滑动开关在许多用户界面设计中都很常见,它...

    android自定义开关控件

    2. 滑动动画:当用户滑动开关时,滑块应有平滑的过渡效果。可以通过`ObjectAnimator`或者手动改变滑块位置并重绘View来实现动画效果。 3. 状态管理:记录开关的当前状态,并在触控事件中更新。可以使用一个布尔变量...

    滑动开关按钮 ios开关按钮

    在Android平台上,为了实现与iOS类似的滑动开关效果,开发者通常会采用自定义控件或者第三方库。 iOS的开关按钮(UISwitch)具有独特的视觉样式,包括一个可滑动的小圆点,当用户向左或向右滑动时,圆点会在两种...

    Android自定义控件实现滑动开关效果

    总结来说,创建一个自定义滑动开关控件,需要理解Android控件的继承体系,定义和使用自定义属性,处理触摸事件,以及绘制和动画效果的实现。这个过程涉及到了Android UI开发的多个方面,对提高开发者在Android界面...

Global site tag (gtag.js) - Google Analytics