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/ ...
随机推荐
- android AsyncTask 详细例子
一个典型AsyncTask的. 01 public class DialogTestActivity extends Activity { 02 private Button button1; ...
- C#用注册表开机自动启动某某软件
代码如下: public static void chkAutoRun(bool isRun) { if (isRun)//开机自动启动 { try { RegistryKey runKey = Re ...
- ncsim仿真VHDL
ncsim仿真VHDL 1.文件列表 ctrl.vhd design_io.vhd tb.vhd compile.nc simulate.nc ./shm/shmtb.tcl 2. Compile你的 ...
- string之substring的用法
package com.j1; public class StringTest1 { public static void main(String[] args) { String s =" ...
- IOS6和IOS7的屏幕适配问题
自从IOS7出来以后,以前写在IOS6上或者更低版本的程序,跑在IOS7的模拟器上就会出现一些问题.最大的问题就是,所有的UI空间都会统一向上移动20个点(如果空间的y值为0,就会被StatusBar ...
- 一张图解析如何让img垂直居中对齐
测试代码: <!DOCTYPE html> <html> <head> <style> .dd { background-color: gray; po ...
- CMS设计-组件化
原来CMS使用的专题类的页面是 : 事先由前端写好完整页面,再交付给运营使用,这样使用的比较灵活,可以根据市场的不同需求由前端切出不同的页面,有时候一旦需求过多,就耽误切图的时间. 现在M和H5采用组 ...
- WordPress页面函数功能代码调用大全
WordPress模板基本文件 style.css 样式表文件index.php 主页文件single.php 日志单页文件page.php 页面文件archvie.php 分类和日期存档页文件sea ...
- 算法导论--python--插入排序
#!/usr/local/python35/bin/python3.5 #### insert sort if __name__=="__main__": var_list=[3, ...
- 自定义Filter服务
自定义一个用户Email长度超过12个字符后值截取前12个然后添加“...”显示. 例如: index.html <!DOCTYPE html> <html ng-app=" ...