今天给大家简单的讲一下自定义控件是如何实现开关按钮的,也是最近学了一点的收获,给大家分享一下。如有什么不同的意见,还望不要吝啬,多多指教。
首先,我们谈谈什么是自定义控件,为什么要有自定义控件?
答:自定义控件,顾名思义就是我们自己定义的控件就是自定义控件咯,有点流氓,但就是这么解释的。那我们为什么要使用自定义控件呢?也就是谷歌给我们封装了很多是API提供我们使用,但有时候为了满足客户的需求,也使我们的产品更加看着牛X,所以在我们的开发中会大量的接触到自定义控件。重要性就不和大家赘述了,开始我们的表演。
其次:自定义控件是怎么样?
答:大家都知道,我们不论什么控件都是extends View或者是ViewGroup。ViewGroup就是View的一个容器。
现在咱们就一起来实现一下,给大家介绍几个方法,也是我们自定控件时必要的方法。onMeaSure()、onLayout()、onDraw()我们就是通过重写这三个方法来实现自定义控件的。我们先看第一个onMeaSure()测量:测量我们自定义控件的宽高。onLayout()这个呢是摆放,也就是我们控件需要摆放的位置。最后一个onDraw()是绘制控件的方法。可能大家刚刚接触这个比较懵,那么,我们通过一个例子来给大家更加直接明了的深入一下。比如,我们买了一张床要摆到卧室里,那我们会怎么做呢?什么样的流程,什么步骤。那么我们肯定会测量一下房子的宽高,我们够买床的宽高,看看是否合适,肯定是不能买大于房子的床吧。所以,这一步尤为关键,也是我们自定义控件的第一步onMeaSure(指定该控件的宽高)。第二步,就是摆放问题了onLayout(摆放所有子VIew),我们买了自己心仪的床之后,那就会想我们把床和床头柜摆到哪里?哪里比较好这里就设计到一个摆放问题,我们具体怎么摆放,进行一个控件的摆放。第三步也到了我们最后一步,就是绘制步骤,也是我们自定义控件中尤为关键的一步onDrow(绘制自己的内容).
接下来我们上代码:
1.创建一个类,继承一个View。重写View中的构造方法,有一个参数,俩个参数,三个参数,四个参数。我们只需要重写前三个就够了,因为第四个构造方法可能会因为API版本问题而导致我们的代码报错。
2.定义方法:设置背景图片的方法、设置按钮背景图的方法、设置状态的方法。// 设置滑块的背景资源
public void setWyqBackgroundResource(int switchBackground) {wyqBackgroupBitmap = BitmapFactory.decodeResource(getResources(),switchBackground);
}// 设置按钮的背景
public void setWyqButtonResource(int slideButton) {wyqButtonBitmap = BitmapFactory.decodeResource(getResources(),slideButton);
}// 设置按钮状态
public void setWyqState(boolean wyqState) {this.wyqState = wyqState;
}

通过以上的方法,当我们在MianActivity中调用这些方法是时候,我们就可以把图片资源设置到自定义控件上。
3.初始化重写onMeasure()、onDraw()、方法。
绘制的第一步,那就是测量了,所以我们要在onMeasure方法中获取资源的宽高,也是我们自定义控件的宽高。
代码如下:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// 设置宽高
setMeasuredDimension(wyqBackgroupBitmap.getWidth(),
wyqBackgroupBitmap.getHeight());
}
绘制第二步,因为我们这里暂时还用不到onLayout,所以我们直接介绍如何使用onDraw(),当大家实现该方的法的时候,会发现paint这样的一个字样,这个呢就是我们绘制所使用的画笔。那么我们的画笔怎么来的?需要我们实例化一个Paint对象。然后在构造方法中都调用这个初始化Paint的方法。初始化画板的时候呢,我们可以设置颜色,设置非锯齿,设置画笔粗细等等,代码就不赘述了,我们看下面的。canvas.drawBitmap(wyqBackgroupBitmap, 0, 0, paint);
通过调用这个方法,实现我们在主页面中设置的图片
绘制滑块:
if (isTouchMode) {
// 根据用户当前触摸到的位置
float newLeft = currentX - wyqButtonBitmap.getWidth() / 2.0f;
int maxLeft = wyqBackgroupBitmap.getWidth()
- wyqButtonBitmap.getWidth();
// 解决滑动左右超出背景的
if (newLeft < 0) {
newLeft = 0;
} else if (newLeft > maxLeft) {
newLeft = maxLeft;
}
canvas.drawBitmap(wyqButtonBitmap, newLeft, 0, paint);

    } else {// 2.2:判断当前按钮的状态,如果是true的话,if (wyqState) {int newLeft = wyqBackgroupBitmap.getWidth()- wyqButtonBitmap.getWidth();canvas.drawBitmap(wyqButtonBitmap, newLeft, 0, paint);} else {//绘制滑块的图片canvas.drawBitmap(wyqButtonBitmap, 0, 0, paint);}}}

//2.3:实现用户的触摸事件
boolean isTouchMode = false;
private OnSwitchStateUpdateListener onSwitchStateUpdateListener;

// private OnSwitchStateUpdateListener onSwitchStateUpdateListener;
// 重写用户触摸事件@Override
public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:isTouchMode = true;currentX = event.getX();break;case MotionEvent.ACTION_MOVE:currentX = event.getX();break;case MotionEvent.ACTION_UP:isTouchMode = false;currentX = event.getX();float center = wyqBackgroupBitmap.getWidth() / 2.0f;boolean state = currentX > center;if (state != wyqState && onSwitchStateUpdateListener != null) {onSwitchStateUpdateListener.onStateUpdate(state);}wyqState = state;break;default:break;}invalidate();// 会引发onDraw被调用,里面的 遍历会重新生效,界面更新return true;// 消费了用户的触摸事件,才可以收到其他的事件
}

接口回调,实现点击事件
boolean isTouchMode = false;
private OnSwitchStateUpdateListener onSwitchStateUpdateListener;
public interface OnSwitchStateUpdateListener {
// 状态回调, 把当前状态传出去
void onStateUpdate(boolean state);
}

public void setOnSwitchStateUpdateListener(OnSwitchStateUpdateListener onSwitchStateUpdateListener) {this.onSwitchStateUpdateListener = onSwitchStateUpdateListener;
}

快速实现自定义控件开关按钮相关推荐

  1. 自定义View控件(2—手写实例代码)

    1. 步骤: + 1.自定义一个类继承于UIView + 2.在initWithFrame方法中添加子控件 + 3.在layoutSubviews中设置子控件的位置 + 4.提供一个属性保存外界传入的 ...

  2. Android自定义控件之实现快速检索

    前言:关于这个快速检索我们平常见到的app应用的很多,比如手机通讯录联系人.微信朋友,以及其他的商品列表等,实现的功能就是通过右侧或者左侧的字母进行快速检测,OK!今天我就带领大家来实现这个功能! - ...

  3. Android自定义控件系列二:自定义开关按钮(一)

    这一次我们将会实现一个完整纯粹的自定义控件,而不是像之前的组合控件一样,拿系统的控件来实现:计划分为三部分:自定义控件的基本部分,自定义控件的触摸事件的处理和自定义控件的自定义属性: 下面就开始第一部 ...

  4. Android自定义控件系列二:自定义开关按钮

    这一次我们将会实现一个完整纯粹的自定义控件,而不是像之前的组合控件一样,拿系统的控件来实现:计划分为三部分:自定义控件的基本部分,自定义控件的触摸事件的处理和自定义控件的自定义属性: 下面就开始第一部 ...

  5. Qt之自定义控件(开关按钮)

    简述 接触过IOS系统的童鞋们应该对开关按钮很熟悉,在设置里面经常遇到,切换时候的滑动效果比较帅气. 通常说的开关按钮,有两个状态:on.off. 下面,我们利用自定义控件来实现一个开关按钮. 简述 ...

  6. Qt之自定义控件(滑动开关按钮)+源码

    Qt之自定义控件(滑动开关按钮) 目录 Qt之自定义控件(滑动开关按钮) 说明 主要实现 实现源码一 实现源码二 说明 本文主要介绍QT的两种滑动开关按钮的实现,附上源码记录以备二次开发 源码附基本注 ...

  7. 自定义控件:快速索引

    快速索引在应用中很常见,在联系人,微信,省市列表,应用管理,文件管理等应用场景都可以看到快速索引的身影,本篇博客将讲解快速索引的自定义,从中你可以学到获取汉字首字母的方法,绘制字母时,纵坐标的计算方法 ...

  8. Qt编写自定义控件一开关按钮

    从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ.360卫士.金山毒霸等,都有很多开关控制一些操作,在Qt widg ...

  9. qt获取当前系统音量值_Qt编写自定义控件50-迷你仪表盘

    一.前言 这个控件取名叫迷你仪表盘,是以为该控件可以缩小到很小很小的区域显示,非常适合小面积区域展示仪表数据使用,还可以手动触摸调节进度,是我个人觉得最漂亮小巧的一个控件.初次看到类似的控件是在一个音 ...

最新文章

  1. android bundle传递list对象集合,如何从android中的firebase中检索List对象
  2. 安徽理工大学计算机技术研究生,安徽理工大学(专业学位)计算机技术研究生辅导...
  3. Intel和IBM押重注的神经模态计算,会给行业带来什么样的变化
  4. mysql 取绝对值_自学MySQL第六天
  5. hdu 1828 pku 1177 Picture
  6. linux系统下源码安装mysql5.6数据库
  7. c语言常用术语,保证让你大开眼界
  8. JS 枚举型变量操作
  9. 参数传值(数组赋值)
  10. CodeForces - 1480D1 Painting the Array I(贪心)
  11. Linux下Jenkins与GitHub自动构建NetCore与部署
  12. 新手也能学会本地调试微信,natapp 官网映射
  13. Windows10远程报错:由于CredSSP加密Oracle修正
  14. 案例:用一条 SQL 语句查询出每门课都大于 80 分的学生姓名
  15. Android架构实例分析之编写hello驱动的HAL层代码
  16. 用SQL Server 2017图形数据库替换数据仓库中的桥表
  17. PAT甲级-1118 Birds in Forest (25 分)
  18. 【MySQL入门指北】第六篇 按条件筛选
  19. 【opencv学习笔记】025之直方图计算 - calcHist函数详解
  20. jchdl - RTL实例 - MOS6502 ALU (Verilog)

热门文章

  1. 文献笔记:《Can we still avoid automatic face detection?》读后感~
  2. 51Nod-1106质数检测
  3. 腾讯手机QQ团队无障碍化探索的曲折与收获
  4. 日本一年中的重要节日及活动
  5. config语言和config.in文件
  6. 计算机开机界面,电脑开机一直出现bios界面
  7. ueditor 配置window.UEDITOR_HOME_URL路径不起作用,提示引用不到该路径,引用的确是另一个项目路径
  8. Python Turtle 小项目 6
  9. 计算几何(立体几何)基础篇
  10. Unity脚本(一)