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/ ...
随机推荐
- OC-字典&数组运用实例:通讯录的实现
需求实现: 一.定义联系⼈类ContactPerson 实例变量:姓名.性别.电话号码.住址.分组名称. 方法:初始化⽅方法(姓名.电话号码).显⽰示联系⼈信息 二.定义AddressBook类, 封 ...
- View事件传递之父View和子View之间的那点事
Android事件传递流程在网上可以找到很多资料,FrameWork层输入事件和消费事件,可以参考: Touch事件派发过程详解 这篇blog阐述了底层是如何处理屏幕输,并往上传递的.Touch事件传 ...
- Ubantu下编译Linux Kernel
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.3.tar.gztar -xzf linux-3.9.3.tar.gzcd li ...
- 今天上传公司服务器出现的.net framework版本错误问题
今天做好一个网站(.net4.0),里面有静态页面也有aspx页面,发布后,满心欢喜的上传到服务器,运行后,静态页没有问题,可是通过导航栏一旦点击进入aspx页面,就会出现错误 ,提示web.conf ...
- Action Result
操作返回的内容成为操作结果 大多数情况下返回ViewResult,基类ActionResult 6钟标准类型: ViewResult:视图结果,包含HTML标记等元素 EmptyResult:空结果 ...
- easyui combobox赋值
$('#cc').combobox('setValue','bitem3').combobox('setText','bitem3')
- Windows下使用ODBC API访问数据库之关键
本文采用SQL2005 + VS2008环境,以ODBC API方式成功连接数据库. 1.SQL安装和环境配置 这部分网上随便搜一下都有很多资料,而且很容易就可以配置成功. 注意的关键点: SA账号配 ...
- 支付宝SDK快速入口链接
支付宝快捷支付SDK官方网站
- UI基础视图----UILabel总结
UILabel是UIKit框架中非常常用的视图类,是UIView的子类,是UIWindow,UIImageView等的兄弟类,因为继承自UIView,所以继承了UIView中的属性和方法,大部分都可以 ...
- C#之获取本地IP地址
最近协助一个项目解决了一个获取IP地址的问题,手机客户端与WebService进行通讯,然后WebService通过TCP通讯把指令传递到另一台PC机上.在测试的过程中,总是会出现WebService ...