自定义仿 IPhone 开关控件

极力推荐文章:欢迎收藏
Android 干货分享

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android
本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
- 自定义View类实现
- 自定义View 布局
- 自定义View 素材
- Activity使用自定义View
自定义ItemToggleView 常用于Settings中,主要控制开关的开启与关闭。
自定义ItemToggleView实现效果如下:


1. 自定义View类实现
public class SwitchControlView extends View implements OnTouchListener {
private Bitmap bg_on, bg_off, slipper_btn;
private float downX, nowX;
private boolean onSlip = false;
private boolean nowStatus = false;
private OnChangedListener listener;
public SwitchControlView(Context context) {
super(context);
init();
}
public SwitchControlView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public void init() {
bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.on_btn);
bg_off = BitmapFactory.decodeResource(getResources(),
R.drawable.off_btn);
slipper_btn = BitmapFactory.decodeResource(getResources(),
R.drawable.white_btn);
setOnTouchListener(this);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Matrix matrix = new Matrix();
Paint paint = new Paint();
float x = 0;
if (bg_on != null && bg_off != null) {
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() - slipper_btn.getWidth() / 2;
else
x = nowX - slipper_btn.getWidth() / 2;
} else {
if (nowStatus) {
x = bg_on.getWidth() - slipper_btn.getWidth();
} else {
x = 0;
}
}
if (x < 0) {
x = 0;
} else if (x > bg_on.getWidth() - slipper_btn.getWidth()) {
x = bg_on.getWidth() - slipper_btn.getWidth();
}
canvas.drawBitmap(slipper_btn, x, 0, paint);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
if (event.getX() > bg_off.getWidth()
|| event.getY() > bg_off.getHeight()) {
return false;
} else {
onSlip = true;
downX = event.getX();
nowX = downX;
}
break;
}
case MotionEvent.ACTION_MOVE: {
nowX = event.getX();
break;
}
case MotionEvent.ACTION_UP: {
onSlip = false;
if (event.getX() >= (bg_on.getWidth() / 2)) {
nowStatus = true;
nowX = bg_on.getWidth() - slipper_btn.getWidth();
} else {
nowStatus = false;
nowX = 0;
}
if (listener != null) {
listener.OnChanged(SwitchControlView.this, nowStatus);
}
break;
}
}
invalidate();
return true;
}
public void setOnChangedListener(OnChangedListener listener) {
this.listener = listener;
}
public void setChecked(boolean checked) {
if (checked) {
nowX = bg_off.getWidth();
} else {
nowX = 0;
}
nowStatus = checked;
}
public interface OnChangedListener {
public void OnChanged(SwitchControlView wiperSwitch, boolean checkState);
}
}
2.自定义View 布局
<com.programandroid.CustomView.SwitchControlView
android:id="@+id/switch_control_view"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center_vertical" />
3. 自定义View 素材


4. Activity使用自定义View
/**
* InitSwitchView 自定义滑动开关实现
*/
private void InitSwitchView() {
// TODO Auto-generated method stub
SwitchControlView wiperSwitch = (SwitchControlView) findViewById(R.id.switch_control_view);
wiperSwitch.setChecked(true);
wiperSwitch.setOnChangedListener(new OnChangedListener() {
@Override
public void OnChanged(SwitchControlView wiperSwitch,
boolean checkState) {
// TODO Auto-generated method stub
if (checkState) {
Toast.makeText(CustomViewMethods.this, "开启", 1).show();
} else {
Toast.makeText(CustomViewMethods.this, "关闭", 1).show();
}
}
});
}
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

自定义仿 IPhone 开关控件的更多相关文章
- Android仿iPhone 滚轮控件 实现
Android_开发 实用滚轮效果选择数字http://blog.csdn.net/zhangtengyuan23/article/details/8653771 Android仿iPhone滚轮控件 ...
- Ext 6.5.3 classic版本,自定义实现togglefield开关控件
1,在Ext 6.5.3的classic版中没有提供开关控件,参照modern版中 togglefield开关的实现,继承滑动器(sliderfield),自定义一个开关按钮.支持value绑定和点击 ...
- android 仿ios开关控件
ios一些控件还是挺美丽的,可是对android程序猿来说可能比較苦逼,由于ios一些看起来简单的效果对android来说可能就没那么简单了,可是没办法非常多产品都是拿ios的一些控件叫android ...
- WinForm 简易仿360界面控件
因为经常要做一些1.2千行的小工具,WinForm自带的TabCtrl又不美观,所以想做成360的样子,在网上找来找去,都只有散乱的代码,没有可以通用的结构,于是自己写了一个简易的通用控件. 控件主要 ...
- 获取 AlertDialog自定义的布局 的控件
AlertDialog自定义的布局 效果图: 创建dialog方法的代码如下: 1 LayoutInflater inflater = getLayoutInflater(); 2 View layo ...
- 使用VideoView自定义一个播放器控件
介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...
- UISwitch 开关控件
UISwitch iOS中的开关控件,只有两种状态,打开或关闭. aSwitch.tintColor = [UIColor redColor]; //关闭状态下的渲染颜色 aSwitch.onTint ...
- android - 自定义(组合)控件 + 自定义控件外观
转载:http://www.cnblogs.com/bill-joy/archive/2012/04/26/2471831.html android - 自定义(组合)控件 + 自定义控件外观 A ...
- Android创建自定义的布局和控件
Android的自带布局有framelayout.linerlayout.relativelayout,外加两个百分比布局,但是这些无法灵活的满足我们的需要,所以我们要自己自定义并引入自己的布局.首先 ...
随机推荐
- Spring 入门程序
1.0 导包的时候要注意: 以上的第一个是.class文件 以上的第二个是文件的解释性页面. 以上的第三个是.java文件 2.0 配置文件需要导入依赖(有dtd 依赖,也有xsd依赖) ² 从be ...
- 分布式理论基础(四)Paxos
1 背景 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 中介绍了一致性,Paxos协议在节点宕机恢复.消息无序或丢失.网络分化的场景下能保证决议的一致性,是被讨论最广泛的一致性协议 ...
- ElasticStack学习(四):ElasticSearch文档使用与操作
一.文档的CRUD介绍 ElasticSearch中存在五种操作,分别如下: 1.Index 该操作表示:如果文档的ID不存在,则创建新的文档.若有相同的ID,先删除现有文档,然后再创建新的文档,同时 ...
- .Net 通过设置Access-Control-Allow-Origin来实现跨域访问
目录 # 前言 # 为每个API接口单独添加响应头 1.针对 ASP.NET MVC 项目的Controllers 2.针对 ASP.NET Web API项目的Controllers 3.针对ASP ...
- c++汉诺塔问题
c++解决汉诺塔问题 题目描述 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到中间的杆上 ...
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
- 006.SQLServer AlwaysOn可用性组高可用部署
一 数据库镜像部署准备 1.1 数据库镜像支持 有关对 SQL Server 2012 中的数据库镜像的支持的信息,请参考:https://docs.microsoft.com/zh-cn/previ ...
- Win10更新后,MySQL服务莫名消失的问题
手欠的给Win10更新,之后就发现右下角托盘里的小海豚变成白色的了,最后确认MySQL服务丢失 解决办法1: 1.重新安装服务:mysqld --install 2.如果之前没有自定义数据保存路径(d ...
- MyBatis 多数据库支持
From<MyBatis从入门到精通> <!-- 4.6 多数据库支持 简单的看了一下,没有深入研究~~~ -->
- Excel公式中问题-记住不要忽略空格!
总结一下之前犯得愚蠢的小问题: 程序:每日报表:从DB下载数据填充到excel,包括3个sheet,sheet1:总结<模板,公式填充,数据源为sheet2,sheet3>;sheet2: ...