SlipButton——滑动开关
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjI1MjUwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjI1MjUwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjI1MjUwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener; /**
* 滑动开关
* 备注:解决初始状态bug --1130
*/
public class SlipButton extends View implements OnTouchListener
{ private boolean IsOpen;//记录当前button是否打开,true为打开,flase为关闭 做了点改动
private boolean OnSlip = false;//记录用户是否在滑动的变量
private float DownX, NowX;//按下时的x,当前的x,
private Rect Btn_On, Btn_Off;//打开和关闭状态下,游标的Rect
private boolean isChgLsnOn = false;
private OnChangedListener chgLsn;
private Bitmap bg_on, bg_off, slip_btn; public SlipButton(Context context)
{
super(context); init();
} public SlipButton(Context context, AttributeSet attrs)
{
super(context, attrs); init();
} private void init()
{//初始化
//加载图片资源 bg_on = BitmapFactory.decodeResource(getResources(),
R.drawable.split_left_1);
bg_off = BitmapFactory.decodeResource(getResources(),
R.drawable.split_right_1);
slip_btn = BitmapFactory.decodeResource(getResources(),
R.drawable.split_1);
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);// 设置监听器,也能够直接复写OnTouchEvent
} @Override
protected void onDraw(Canvas canvas)
{
//画图函数
super.onDraw(canvas); Matrix matrix = new Matrix();
Paint paint = new Paint();
float x; //依据设置推断初始状态
if (IsOpen)
{
NowX = bg_on.getWidth();
}
else
{
NowX = 0;
}
{
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 (IsOpen)//依据如今的开关状态设置画游标的位置
{
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 = IsOpen;
if (event.getX() >= (bg_on.getWidth() / 2))
{
IsOpen = true;
}
else
{
IsOpen = false;
} if (isChgLsnOn && (LastChoose != IsOpen))//假设设置了监听器,就调用其方法..
{
chgLsn.onChanged(IsOpen, this);
}
break;
default: } invalidate();//重画控件
return true;
} public void setOnChangedListener(OnChangedListener l)
{//设置监听器,当状态改动的时候
isChgLsnOn = true;
chgLsn = l;
} public void setCheck(boolean isCheck)
{
IsOpen = isCheck;
invalidate();
} public interface OnChangedListener
{
abstract void onChanged(boolean checkState, View v);
}
}
SlipButton——滑动开关的更多相关文章
- 【转】Android SwitchButton(滑动开关)
原文网址:http://blog.csdn.net/wangjinyu501/article/details/27961303 版本:1.0 日期:2014.5.17 2014.6.1 版权:© 20 ...
- Android 三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现
android三档自定义滑动开关,禁止点击功能的实现,普通开关网上有很多例子,三档滑动开关的则找了整天都没有相关例子,开始用普通开关的源码修改了自己实现了一个类,但效果不如人意,各种边界情况的算法很难 ...
- Android SwitchButton(滑动开关)
@RemoteView public class Button extends TextView { public Button(Context context) { this(context, nu ...
- 自定义控件(视图)2期笔记05:自定义控件之继承自View(滑动开关)
1. 开关按钮点击效果,如下: 2. 继承已有View实现自定义View 3. 下面通过一个案例实现滑动开关的案例: (1)新建一个新的Android工程,命名为" 开关按钮", ...
- pyqt实现滑动开关
https://www.cnblogs.com/feiyangqingyun/p/6035633.html 根据Qt的实现,在PyQt上面实现了滑动开关的控件 import sys from PyQt ...
- Android实现Material Design风格的设置页面(滑动开关控件)
前言 本文链接 http://blog.csdn.net/never_cxb/article/details/50763271 转载请注明出处 參考了这篇文章 Material Design 风格的设 ...
- android自定义控件——以滑动开关为例
0.引言 (1)Android从4.0开始提供了switch的滑动开关效果组件,但是之前版本却没有 (2)很多时候我们写程序,都希望把有用的通用的通用的东西封装起来,以便以后重用. 本文根据组件开发思 ...
- 滑动开关效果 css3滑动开关】纯CSS3代码实现滑动开关效果-css3滑动效果-css3左右滑动
今天看到一篇有关 css3事件的博文,一时兴起便整理下相关的资料. 点击按钮,可以实现开关的滑动效果. 今天看到一篇有关 css3事件的博文,一时兴起便整理下相关的资料. 点击按钮,可以实现开关的滑动 ...
- bootstrap滑动开关插件使用
下载和演示插件地址 需要引入的css和js <link rel="stylesheet" type="text/css" href="/css/ ...
随机推荐
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...
- python - 面向对象(二)
类的三大特性 类的三大特性包括: 封装.继承.多态 一.封装 封装就是将类所用到的所有字段.属性.方法都包含在类代码段里面,当实例调用直接调用类中的方法即可. class People(object) ...
- document.write 向文档中写内容,包括文本、脚本、元素之类的,但是它在什么时候执行不会覆盖当前页面内容尼?
当你打开一个页面,浏览器会 调用 document.open() 打开文档 document.write(...) 将下载到的网页内容写入文档 所有内容写完了,就调用 document.close() ...
- Javascript实现表格行排序
网站开发中凡是用到表格来展示数据的,往往都要根据某个列来对行排序,下面是我从书上看到的一个行排序例子,看过后受益匪浅,故分享出来. 直接献上完整代码: <!doctype html> &l ...
- java 静态文件使用注解
spring框架为我们代码的编写带来了极大的便利,特别是注解的使用.但是有个问题,当我们在静态文件中使用注解的时候,这个时候就会报错了.如以下代码: @Autowired private UserSe ...
- 数据库分库分表(sharding)系列(二) 全局主键生成策略
本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表( ...
- NSString字符串类型-学习总结
1.字符串的创建 (1)创建常量字符串 NSString *str = @"This is a String"; //str是变量名 (2)创建空的字符串,给字符串赋值 NSStr ...
- sql 更新一列为行号
update u_menu set issort=t1.rowId from ( --select * from --( select cmenu_id,ROW_NUMBER() over(O ...
- Lua 字符串函数小结
1.求字符串长度 string.len(str) 2.大小写转换 string.upper(str) string.lower(str) 3.字符串查找(非全局) --func_string.lua ...
- 一则 Mysql 建表语句
DROP TABLE IF EXISTS `nuvue`; CREATE TABLE `nuvue`( `id` ) UNSIGNED NOT NULL AUTO_INCREMENT, `status ...