Android 自定义View之随手指滑动的ToggleButton
2016-04-16 03:35
495 查看
因为项目里需要可滑动的ToggleButton,就去网上搜了一下,下载了两个例子看下,一个是仿ios6.0的滑动效果,虽说是滑动,但不是我想要的样式,还有一个是使用的facebook开源框架rebound的动画效果的ToggleButton,效果很赞,可惜的是不支持滑动。一开始我是想在第二种例子上做点文章,重写onDraw和onTouch方法支持滑动的同时还有动画效果。可惜的是尝试失败了,主要原因还是对这种动画框架不太了解,详细参数和使用不太了解,再加上我平时在这一块本身就不太擅长,所以就只写了一个普通的效果,不过还是满足了需求,所以就介绍一下,其实挺简单。
第一个是off状态的效果图:
这是on状态的效果图:
简单重写了onLayout方法,在里面设置radius为view高度的一半,核心代码就是onDraw方法和onTouch方法:
然后是onTouch方法:
另外还写了一个回调方法,在activity中实现。
csdn代码下载地址:http://download.csdn.net/my
第一个是off状态的效果图:
这是on状态的效果图:
简单重写了onLayout方法,在里面设置radius为view高度的一半,核心代码就是onDraw方法和onTouch方法:
protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint();//圆框矩形的画笔 Paint spotPaint = new Paint();//里面手柄的画笔 spotPaint.setColor(spotColor); float x = 0; rect.set(0, 0, getWidth(), getHeight());//设置view(外面圆框矩形)大小 paint.setColor(offColor); canvas.drawRoundRect(rect, radius, radius, paint); //手指在左边时颜色为offColor,右边为onColor if (NowX < (getWidth() / 2)){ x = NowX; paint.setColor(offColor); canvas.drawRoundRect(rect, radius, radius, paint); }else { x = NowX; paint.setColor(onColor); canvas.drawRoundRect(rect, radius, radius, paint); } //重置x的值,可以试一下如果没有前两个判断界面会是什么状态 if (x < radius){ x = radius; }else if (x > getWidth() - radius){ x = getWidth() - radius; }else { x = NowX; } canvas.drawCircle(x, getHeight()/2, getHeight()/2, spotPaint); }
然后是onTouch方法:
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() > getWidth() || event.getY() > getHeight()) return false; OnSlip = true;//是否为滑动状态为true DownX = event.getX(); NowX = DownX; break; case MotionEvent.ACTION_CANCEL://可以不写,和up一样 OnSlip = false; boolean choose = isChosen; if (NowX >= (getWidth() / 2)) { NowX = getWidth(); isChosen = true; } else { NowX = 0; isChosen = false; } if (isChgLsnOn && (choose != isChosen)) ChgLsn.OnChanged(isChosen); break; //抬起的时候若event.getX()在左半边isChosen为false,右半边为true ,对NowX值作处理 case MotionEvent.ACTION_UP: OnSlip = false; boolean LastChoose = isChosen; if (event.getX() >= (getWidth() / 2)) { NowX = getWidth(); isChosen = true; } else { NowX = 0; isChosen = false; } if (isChgLsnOn && (LastChoose != isChosen)) { ChgLsn.OnChanged(isChosen); } break; default: } invalidate(); return true; }
另外还写了一个回调方法,在activity中实现。
csdn代码下载地址:http://download.csdn.net/my
相关文章推荐
- Android Google Services Framework & Google Play
- Android Handler中的handleMessage方法和post方法之源码剖析
- Android图片加载框架
- Android中导入别人的项目乱码
- Android SQLite数据库
- 简单强大的选择状态管理器,批量改变View样式 SelectStateManager - android
- Android笔记【5】--PS 练习买咖啡
- android 7.0 学习笔记(一)
- Android应用开发之(Gson的使用)
- The patch E:\android-sdk-windows does not belong to a directory.Android studio will use this Andriod
- tabFragment切换避免页面重叠
- Android使用 ZProgressHUD 发生崩溃的问题
- Android进阶学习-属性动画与自定义属性
- Android开发常遇问题——Duplicate files copied in APK META-INF/LICENSE.txt(IDE 是 Android studio )
- Android——监听事件总结
- Android HashMap源码详解
- React-Native系列Android——Native与Javascript通信原理(二)
- Android Studio 错误 Duplicate files copied in APK META-INF/LICENSE.txt
- Android init源代码分析(1)概要分析
- android ImageView 解读