自定义Switch滑动开关

本文介绍了如何自定义Android中的Switch滑动开关,包括继承View并重写onDraw和onMeasure方法,以及处理触摸事件来实现开关的滑动效果。通过监听用户的滑动或点击,动态改变开关的位置,并在松开后执行相应的操作。同时,讲解了如何处理自定义属性,将Drawable转换为Bitmap,以及如何设计接口回调供外部操作。
摘要由CSDN通过智能技术生成

要自定义控件需要先继承View然后再重写两个方法,分别是onDraw方法和onMeasure().
(有时还可能会用到onLayout方法—改变该自定义控件在ViewGroup中的位置)
(加载自定义属性和的layout布局文件的代码可写在构造方法中,findviewbyId实例化控件写在onFinishInflate方法中更好些)
(在某些情况下还会用到onSizeChanged方法,view的绘图触发事件可写在这里。)
如果只重写onFinishInflate(),onSizeChanged(),onDraw()三个方法时执行顺序是:

 22:23:03.597: D/mDebug(9715): onFinishInflate  
 22:23:03.667:  D/mDebug(9715):onSizeChanged,w=240,h=282,oldw=0,oldh=0  
 22:23:03.727: D/mDebug(9715): onDraw  

//onDraw的参数是canvas: the canvas on which the background will be drawn
onDraw方法:主要负责绘制图形(也可是Bitmap)
注意哦:该控件继承的对象是,直接或,间接继承View的ViewGroup,比如LinearLayout,可能onDraw不会被执行,这是就要注意,setWillNotDraw(false);setWillNotDraw===>让不绘图,false。双重否定,就是让他绘图,之后onDraw才会被调用。

onMeasure方法主要是负责控制该view的大小(没有重写时是默认调用系统的onMeasure方法)。
有个没意义的小实验:有时候控件不想被xml中写死,想在代码中动态的改变控件的大小(只是外部大小,内容没有进行缩放,设置之后部分内容可能被遮掉),

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = MeasureSpec.getSize(heightMeasureSpec);  
        int width = MeasureSpec.getSize(widthMeasureSpec);  
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height,MeasureSpec.UNSPECIFIED);
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(width,MeasureSpec.UNSPECIFIED);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

在onMeasure方法中加上这段代码,将测量模式设置为MeasureSpec.UNSPECIFIED,也就是大小不受限制,Java代码中可以通过setMinimumHeight()和setMinimumWidth()动态的修改控件大小。
相当于在外部调用了本来外部不能被调用到的setMeasuredDimension,控制控件的大小。

进入正题,其实开关就是两个图片构成的,一张是背景图片一张是开罐图片,只需要控制开关图片,就能显示的看到开关的改变。就是通过监听用户对控件(其实就是背景图片上面的开关图片)对它的滑动或点击事件。

实现方式可能有多种,有些方式区分多种状态标记,且点击(DOWN)后立即响应开关滑至左边或右边。而这里没有用多种状态标记,且是对点击事件(DOWN)不立刻处理,而是在松开后才会移动到左边或右边,滑动事件是立即处理,移动的时候一直在重绘。

如果是直接通过代码添加那就需要测量出那张图drawable_bg的大小作为
控件的总宽度bgbitmap.getWidth(),高度也是一样的,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值