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/ ...
随机推荐
- 内存测试工具memtester
Memtester是用户态工具,用于测试内存子系统的故障.非常方便,支持32位 或64位Unix-like系统.对于硬件开发开发者来说,memtester可以定位到物理地址. 1. 安装 下载地址ht ...
- 什么是系统平均负载(Load average)
一.什么是系统平均负载(Load average)? 在Linux系统中,uptime.w.top等命令都会有系统平均负载load average的输出,那么什么是系统平均负载呢? Load Aver ...
- 让qq图标在自己的网站上显示方法
代码如下: <div id="xixi" onmouseover="toBig()" style="top: 260px; left: 5px; ...
- hashtable 和dictionary
hashtable 通过 key 和value 进行访问 不是 通过 索引访问 对类型没有强制规定 ,所以类型危险 容易出错 无效的key时 会返回空 dictionary 与hashtable 相区 ...
- 后台写js 并跳转
Response.Write("<script>alert('成功');location.replace('ApplyClass.aspx')</script>&qu ...
- iOS的触摸事件
在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件,我们称其为@''响应者对象''UIApplication,UIViewController,UIView都 ...
- hdu1520 第一道树形DP,激动哇咔咔!
A - 树形dp Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- C/C++中的空类及抽象类大小
代码: #include <iostream> using namespace std; struct A{ }; struct B{ int i; }; class C:B{ ; }; ...
- .Net 插入数据MySql数据库,中文乱码解决问题
1, 修改mysql根目录下配置文件my.ini,在[client]节点下添加default-character-set=utf8 ,在[mysqld]节点下添加character_set_serve ...
- $.unique() 对象组成的数组去掉重复对象
发现一件事,一个完全由对象组成的数组,用$.unique()方法去掉重复的时候不管用 var arr = [{text:'第一个',value:'1'},{text:'第二个',value:'2'}, ...