这篇博客要讲的是自定义switchButton,不过没有设置动画效果。

我用GradientDrawable来绘制switchButton,我们先看看最终的效果:

点击前:

点击后

接下来我们看看如何实现

首先:该类继承RelativeLayout

SwitchButton extends RelativeLayout{
}

该类需要用到的成员:

    private ImageView track; //滑块所在的轨道
private ImageView slider; //switchButton上面的滑块 private GradientDrawable trackDrawable; //用于绘制轨道
private GradientDrawable sliderDrawable; //用于绘制滑块 private LayoutParams trackLy; //轨道的布局
private LayoutParams sliderLy; //滑块的布局
private boolean isCkeck = false; //是否点击

构造方法:

public SwitchButton(Context context) {
super(context);
init();
} public SwitchButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init(){
setClickable(true);
setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
track = new ImageView(getContext());
slider = new ImageView(getContext()); trackLy = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
trackLy.addRule(CENTER_VERTICAL); sliderLy = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
sliderLy.addRule(CENTER_VERTICAL); track.setLayoutParams(trackLy);
slider.setLayoutParams(sliderLy); trackDrawable = new GradientDrawable();
sliderDrawable = new GradientDrawable();

//轨道的形状,颜色,大小,边缘,角度
trackDrawable.setShape(GradientDrawable.RECTANGLE);
trackDrawable.setColor(getResources().getColor(R.color.white_FFFFFFFF));
trackDrawable.setSize(getResources()
.getDimensionPixelOffset(R.dimen.track_width),
getResources().getDimensionPixelOffset(R.dimen.track_height));
trackDrawable.setStroke(getResources()
.getDimensionPixelOffset(R.dimen.switch_button_stroke),
getResources().getColor(R.color.gray));
trackDrawable.setCornerRadius(getResources()
.getDimension(R.dimen.switch_button_cornerRadius));

//设置滑块的形状,颜色,大小,边缘,角度
sliderDrawable.setShape(GradientDrawable.OVAL);
sliderDrawable.setColor(getResources().getColor(R.color.white_FFFFFFFF));
sliderDrawable.setSize(getResources()
.getDimensionPixelOffset(R.dimen.slider_size),
getResources().getDimensionPixelOffset(R.dimen.slider_size));
sliderDrawable.setStroke(getResources()
.getDimensionPixelOffset(R.dimen.switch_button_stroke),
getResources().getColor(R.color.gray)); //设置给imageView
track.setImageDrawable(trackDrawable);
slider.setImageDrawable(sliderDrawable); addView(track);
addView(slider); setOnClickListener(this);
}

设置点击事件

@Override
public void onClick(View view) {
if (isCkeck)
{
isCkeck = false;
}else {
isCkeck = true;
}
setCheck(isCkeck);
}
private void setCheck(boolean isCheck){
if (isCheck){
//轨道变为蓝色
trackDrawable.setColor(getResources().getColor(R.color.blue));
//注意这里进行版本判断。if与else里面代码的效果是相同的,只是有些代码在某些版本下才能够用
if (Build.VERSION.SDK_INT >= 17) {
sliderLy.addRule(ALIGN_PARENT_END);
//设置新的布局之前,要先移除之前的布局,否则会有叠加的效果
sliderLy.removeRule(ALIGN_PARENT_START);
} else {
sliderLy.addRule(ALIGN_PARENT_RIGHT);
sliderLy.addRule(ALIGN_PARENT_LEFT,0);
}
slider.setLayoutParams(sliderLy);
}else {
trackDrawable.setColor(getResources().getColor(R.color.white_FFFFFFFF));
if (Build.VERSION.SDK_INT >= 17) {
sliderLy.removeRule(ALIGN_PARENT_END);
sliderLy.addRule(ALIGN_PARENT_START);
} else {
sliderLy.addRule(ALIGN_PARENT_RIGHT,0);
sliderLy.addRule(ALIGN_PARENT_LEFT);
}
slider.setLayoutParams(sliderLy);
}
}

 以上便是所有的代码。

请尊重劳动成果,转载请标明出处:http://www.cnblogs.com/tangZH/p/8277428.html

自定义switchButton的更多相关文章

  1. 如何在pyqt中自定义SwitchButton

    前言 网上有很多 SwitchButton 的实现方式,大部分是通过重写 paintEvent() 来实现的,感觉灵活性不是很好.所以希望实现一个可以联合使用 qss 来更换样式的 SwitchBut ...

  2. Android Tools 开发工具库开源项目总结

    在Android开发中,我们不免会遇到使用一些工具库来简化我们的工具代码的编写,以下是本人之前star的开源项目,供大家参考: 一.android_testsuite 项目地址:https://git ...

  3. 自定义的开关按钮——SwitchButton

    本文转自:http://blog.csdn.net/swust_chenpeng/article/details/19967501 我将原文的控件进行了一些修改,去掉了原来控件的外边框,只留下重要的遮 ...

  4. Android 自定义的开关按钮——SwitchButton

    本文转自:http://blog.csdn.net/swust_chenpeng/article/details/19967501 我将原文的控件进行了一些修改,去掉了原来控件的外边框,只留下重要的遮 ...

  5. SwitchButton 开关按钮 的多种实现方式

    刚开始接触开关样式的按钮是在IOS系统上面,它的切换以及滑动十分帅气,深入人心. 所谓的开关按钮,就是只有2个状态:on和off,下图就是系统IOS 7上开关按钮效果. 起初我在android上我只会 ...

  6. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

  7. 【转】Android SwitchButton(滑动开关)

    原文网址:http://blog.csdn.net/wangjinyu501/article/details/27961303 版本:1.0 日期:2014.5.17 2014.6.1 版权:© 20 ...

  8. 自定义View-6 状态按钮 滑动 点击

    View public class SwitchButton extends View implements OnClickListener, OnTouchListener {     privat ...

  9. 自定义view-滑动开关

    介绍 前段时间,我看到了一篇关于可滑动开关Switch组件的文章,效果图如下: 思路也挺简单的:这个控件主要由田径场式背景和滑块组成.他将田径场式背景分为3部分,最左边的半圆,中间的两条直线部分和最右 ...

随机推荐

  1. 【安富莱专题教程第5期】工程调试利器RTT实时数据传输组件,替代串口调试,速度飞快,可以在中断和多任务中随意调用

    说明:1.串口作为经典的调试方式已经存在好多年了,缺点是需要一个专门的硬件接口.现在有了SEGGER的RTT(已经发布有几年了),无需占用系统额外的硬件资源,而且速度超快,是替代串口调试的绝佳方式.2 ...

  2. navicat实现Mysql数据备份

    方法/步骤     使用navicat工具连接mysql数据库,这里以navicat for Mysql工具为例.如果数据库在本机,那么连接ip处写localhost即可,如果数据库在其他机器,那需要 ...

  3. LeetCode题解38.Count and Say

    38. Count and Say The count-and-say sequence is the sequence of integers beginning as follows: 1, 11 ...

  4. [Swift]LeetCode230. 二叉搜索树中第K小的元素 | Kth Smallest Element in a BST

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  5. python获取当前运行程序的名字

    import os filename = os.path.abspath(__file__) print filename 打印结果: E:\bluedon\test.py

  6. Hadoop源码篇--Reduce篇

    一.前述 Reduce文件会从Mapper任务中拉取很多小文件,小文件内部有序,但是整体是没序的,Reduce会合并小文件,然后套个归并算法,变成一个整体有序的文件. 二.代码 ReduceTask源 ...

  7. 利用Grafana展示zabbix数据

    一.系统搭建(以Centos7为例)因为我们的主要目的是展示zabbix的数据,所以建议大家直接在zabbix的服务器上搭建这个系统,亲测两系统无冲突,这样部署的好处是两系统间的数据传输更快,前端展示 ...

  8. redis 系列10 字符串对象

    一. 字符串对象编码 Redis中字符串可以存储3种类型,分别是字节串(byte string).整数.浮点数.在上章节中讲到字符串对象的编码可以是int, raw,embstr. 如果一个字符串对象 ...

  9. VS 2013 professional版在win10上安装出错的解决方法

    VS 2013 professional版在win10上安装出错的解决方法 win10上安装完VS 2012 professional和VS 2017 professional后,由于项目的需要,要在 ...

  10. 淘宝npm镜像使用方法(转)

    1.临时使用 npm --registry https://registry.npm.taobao.org install express 2.持久使用 npm config set registry ...