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/ ...
随机推荐
- Java清洁:终结处理和垃圾回收
一般情况:Java有垃圾回收机制负责回收无用对象占据的内存资源. 特殊情况:假定你的对象(并非使用new)获得一块特殊的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道如何释放 ...
- VS2010使用附加进程的方式调试IIS中的页面介绍
1. 对要测试的页面设置断点,然后选择”调试”->”附加到进程”,在进程中选择w3wp.exe进程(需要先打开需测试的页面) 2. 配置完成,当打开你需要测试的页面的时候 ...
- Java------------运算符优先级速记口诀
单目乘加位关系,逻辑三目后赋值. 单目:单目运算符+ –(负数) ++ -- 等 乘加(乘除加减):算数单目运算符* / % + - 位:位移单目运算符<< >> 关系:关系单 ...
- 《第一行代码》学习笔记28-内容提供器Content Provider(1)
1.内容提供器:用于在不同的应用程序之间实现数据共享的功能,提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问 数据的安全性.使用内容提供器是Android实现跨程序共享数据 ...
- S2SH简单介绍和理解
struts2简介 Struts2是由WebWork基础上发展起来的,与struts1比较,选用struts2的理由是:①Struts1要求Action类继承一个抽象基类,而Struts2Action ...
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...
- shell中的双括号表达式
语法格式 (( expression )) expression可以是任何数学表达式,可以包含的操作符有: + 加 - 减 * 乘(无需转义) / 除 % 取余 ** 指数 == 等于 != 不等 ...
- paip.使用WORD进行拆分段落单个汉字转表格.txt
paip.使用WORD进行拆分段落单个汉字转表格.txt 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- 【Nutch2.2.1基础教程之6】Nutch2.2.1抓取流程
一.抓取流程概述 1.nutch抓取流程 当使用crawl命令进行抓取任务时,其基本流程步骤如下: (1)InjectorJob 开始第一个迭代 (2)GeneratorJob (3)FetcherJ ...
- Django QuerySets 里的**kwargs: 动态创建ORM查询
Django的数据库API查询经常包含关键字参数.例如: bob_stories = Story.objects.filter(title_contains='bob', subtitle_conta ...