目录:
    1.应用场景
    2.常用属性       
    3.事件监听与基本使用
    4.自定义ToggleButton
        4.1 java代码自定义可拖动ToggleButton
        4.2 Selector自定义点击切换ToggleButton
         
1.应用场景 
    ToggleButton与Switch和CheckBox类似,具备两种状态,而CheckBox的主要场景在于数据的的单项选择比如,人的性别,而ToggleButton与Switch应用于程序中两种状态的切换。
    
2.常用属性

1. 继承Button的相关属性
        2.android:textOn="关闭"//设置按钮开启时显示的文本
        3.android:textOff="打开"//设置按钮关闭时显示的文本
        4.android:checked="true"//设置按钮是否被选中,默认未选中

3.事件监听与基本使用

xml文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.andy.androiduitogglebutton.MainActivity" ><ToggleButtonandroid:id="@+id/togglebutton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textOn="打开"android:textOff="关闭"android:checked="true"/></LinearLayout>

Java代码:

    package com.andy.androiduitogglebutton;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.Toast;import android.widget.ToggleButton;public class MainActivity extends Activity {private ToggleButton togglebutton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化togglebuttontogglebutton = (ToggleButton) findViewById(R.id.togglebutton);//设置监听器togglebutton.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if(isChecked){Toast.makeText(MainActivity.this, "打开", Toast.LENGTH_LONG).show();}else{Toast.makeText(MainActivity.this, "关闭", Toast.LENGTH_LONG).show();}}});}}

4.自定义ToggleButton
    4.1 先上截图,顺序和文章顺序一致,第一个为普通实现,第二个为Selector自定义点击切换ToggleButton, 第三个为java代码自定义可拖动ToggleButton

4.1 Selector自定义点击切换ToggleButton
1)制作图片导入(我就随意网上找了两张,伙伴们可自行PS,看起来美观一点)    
2)toggle_selector.xml

    <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" ><item android:state_checked="true" android:drawable="@drawable/on"></item><item android:drawable="@drawable/off"></item></selector>

3) 主布局文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.andy.androiduitogglebutton.MainActivity" ><ToggleButtonandroid:id="@+id/togglebut1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/toggle_selector"android:textOn=""android:textOff=""android:checked="true"></ToggleButton></LinearLayout>

4) Java代码:

    package com.andy.androiduitogglebutton;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.Toast;import android.widget.ToggleButton;public class MainActivity extends Activity {private ToggleButton togglebut1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化togglebuttontogglebut1 = (ToggleButton) findViewById(R.id.togglebut1);togglebut1.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if(isChecked){Toast.makeText(MainActivity.this, "打开", Toast.LENGTH_LONG).show();}else{Toast.makeText(MainActivity.this, "关闭", Toast.LENGTH_LONG).show();}}});}}

4.2 java代码自定义可拖动ToggleButton
1)准备3张图片switch_btn_on.png(打开时背景图),switch_btn_off.png(关闭时背景图),switch_btn_slipper.png(滑块背景)

2)主布局文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.andy.androiduitogglebutton.MainActivity" ><com.andy.androiduitogglebutton.MyToggleButton android:id="@+id/my_togglebut"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

3)自定义View文件MyToggleButton.java

    package com.andy.androiduitogglebutton;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class MyToggleButton extends View {//滑动開背景图片private  Bitmap toggle_bkg_on;//滑动關背景图片private  Bitmap toggle_bkg_off;//滑动块的图片private  Bitmap toggle_slip;//ToggleButton的状态private  Boolean toggleState=true;//滑动状态,false为未滑动状态private Boolean isSliding = false;//手指滑动的距离private float currentX;//声明OnToggleStateChangeListener接口变量private OnToggleStateChangeListener listener;public void setToggle_bkg_on(int toggle_bkg_on) {this.toggle_bkg_on = BitmapFactory.decodeResource(getResources(), toggle_bkg_on);}public void setToggle_bkg_off(int toggle_bkg_off) {this.toggle_bkg_off = BitmapFactory.decodeResource(getResources(), toggle_bkg_off);}public void setToggle_slip(int toggle_slip) {this.toggle_slip = BitmapFactory.decodeResource(getResources(), toggle_slip);}public void setToggleState(Boolean toggleState) {this.toggleState = toggleState;}/*帶3個參數構造方法,在xml中應用是可以指定樣式和屬性* context:上下文*AttributeSet:属性值集合*defStyleAttr:Theme下默认的Style*/public MyToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}/** 帶2個參數構造方法,在xml中使用時可以指定屬性*/public MyToggleButton(Context context, AttributeSet attrs) {super(context, attrs);}/** 帶1個參數構造方法*/public MyToggleButton(Context context) {super(context);}/** 繼承View的方法,測量髖高*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight());}/** 根据拖动位置绘制图像*/@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//如果移动距离小于背景一般,绘制关闭按钮背景,否则绘制打开按钮背景if (currentX <toggle_bkg_off.getWidth()/2){canvas.drawBitmap(toggle_bkg_off, 0, 0, null);}else{canvas.drawBitmap(toggle_bkg_on, 0, 0, null);}float slip_left = 0; if(isSliding){if(currentX > toggle_bkg_off.getWidth()-toggle_slip.getWidth()){slip_left = toggle_bkg_off.getWidth()-toggle_slip.getWidth();canvas.drawBitmap(toggle_slip, slip_left, 0,null);               }else{slip_left = currentX - toggle_slip.getWidth()/2;canvas.drawBitmap(toggle_slip, slip_left, 0,null);} }else{if(toggleState){slip_left =toggle_bkg_off.getWidth() - toggle_slip.getWidth();canvas.drawBitmap(toggle_slip, slip_left, 0,null);  }else{canvas.drawBitmap(toggle_slip, 0, 0,null); } }//滑出左边界if(currentX < 0){canvas.drawBitmap(toggle_slip, 0, 0,null);}//滑出右边界 if (currentX > toggle_bkg_off.getWidth()-toggle_slip.getWidth()){slip_left = toggle_bkg_off.getWidth()-toggle_slip.getWidth();canvas.drawBitmap(toggle_slip, slip_left, 0,null);    }      }/** 继承view触摸事件方法并实现逻辑*/@Overridepublic boolean onTouchEvent(MotionEvent event) {//获取滑动距离currentX = (int) event.getX();switch(event.getAction()){case MotionEvent.ACTION_DOWN://滑动状态改成truecurrentX = event.getX();isSliding=true;break;case MotionEvent.ACTION_MOVE://移动currentX = event.getX();break;    case MotionEvent.ACTION_UP://滑动状态改成falseisSliding=false;//如果滑动距离大于背景的1/2将开关打开,小于1/2将开关关闭if(currentX < toggle_bkg_off.getWidth()/2){//检测原来的开关状态是否为开,如果是开则关闭它if(toggleState){//关闭ToggleButtontoggleState = false;//检测是否注册监听器,如果没有则注册if(listener != null){listener.onToggleStateChange(toggleState);}}}else{if(!toggleState){toggleState = true;//检测是否注册监听器,如果没有则注册if(listener !=null){listener.onToggleStateChange(toggleState);}                 }}break;}//在onTouchEvent事件完成后重新调用onDraw绘制图形invalidate();//返回true表示操作完毕return true;}/*** 定义一个ToggleButton状态改变监听器接口*/interface OnToggleStateChangeListener{void onToggleStateChange(Boolean state);}   /**实现设置状态改变监听方法*/    public void setOnToggleStateChangeListener(OnToggleStateChangeListener listener){this.listener=listener;}}

4)MainActivity.java

    package com.andy.androiduitogglebutton;import com.andy.androiduitogglebutton.MyToggleButton.OnToggleStateChangeListener;import android.app.Activity;import android.os.Bundle;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.Toast;import android.widget.ToggleButton;public class MainActivity extends Activity {private ToggleButton togglebutton;private MyToggleButton mytogglebutton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化mytogglebuttonmytogglebutton =(MyToggleButton) findViewById(R.id.my_togglebut);//设置打开背景图mytogglebutton.setToggle_bkg_on(R.drawable.switch_btn_on);//设置关闭背景图mytogglebutton.setToggle_bkg_off(R.drawable.switch_btn_off);//设置滑动块背景图mytogglebutton.setToggle_slip(R.drawable.switch_btn_slipper);//设置ToggleButton初始状态mytogglebutton.setToggleState(false);//mytogglebutton设置监听mytogglebutton.setOnToggleStateChangeListener(new OnToggleStateChangeListener() {@Overridepublic void onToggleStateChange(Boolean state) {if(state){Toast.makeText(MainActivity.this, "打开", Toast.LENGTH_SHORT).show();}else{Toast.makeText(MainActivity.this, "关闭", Toast.LENGTH_SHORT).show(); }}});            }}

Android UI(ToggleButton)详解相关推荐

  1. android ui框架详解,多图详解 “Android UI”设计官方教程(二)

    编者注:本文为Android的官方开发者博客发了一份幻灯片的翻译文档的第二部分,专门介绍了一些Android UI设计的小贴士,我们在介绍这个幻灯片的第一部分<多图详解 "Androi ...

  2. Android UI开发详解之ActionBar .

    在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果. 一.添加A ...

  3. android switch 空间,android Android UI(Switch)详解

    目录: 1.应用场景与概述 2.常用属性 3.简单使用 4.更改默认Switch的样式 5.自定义Switch 1.应用场景与概述 Switch是在4.0以后推出的,所以要注意开发时的minsdk设置 ...

  4. Android UI开发详解之ActionBar

    原文地址:http://www.open-open.com/lib/view/open1373981182669.html 在Android3.0之后,Google对UI导航设计上进行了一系列的改革, ...

  5. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  6. Android LiveData组件详解以及LiveDataBus

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/99749323 本文出自[赵彦军的博客] 一.LiveData简介 LiveDat ...

  7. Android Studio 插件开发详解一:入门练手

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112003 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  8. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  9. Android中AMS工作原理,Android AMS启动详解

    启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...

最新文章

  1. 程序员的岗位方向和所需技能都有哪些?
  2. 《强化学习周刊》第25期:DeepMind提出无模型风险敏感强化学习、谷歌发布 RLDS数据集生态系统...
  3. 2019.7.15随笔
  4. 洛谷 P1678 烦恼的高考志愿
  5. JAVA 判断其是否为合法标识符
  6. VTK:vtkCompositePolyDataMapper2用法实战
  7. netdev: dev_watchdog timer(结合stmmac 分析)
  8. 170905-MyBatis中的关系映射
  9. 设计模式之 - 代理模式(Proxy Pattern)
  10. Adobe Camera Raw13 for mac(PS Raw增效工具)支持M1
  11. C#日期格式化,时间
  12. 请写出至少五个块级元素_Java 面试题(五)
  13. 注解形式控制器 数据验证,类型转换(3)
  14. datasource dbcp 数据源_数据源--.dbcp.BasicDataSource 使用
  15. jdk lambda表达式的坑
  16. java ip范围_Java判断IP是否在指定范围
  17. eclipse快捷键使用
  18. Android仿人人客户端(v5.7.1)——有关滑动式左侧菜单实现过程中网友的疑问解答
  19. java 时区转换 转换成东八区 时间
  20. 新世纪版五笔字根高清版

热门文章

  1. 使用C#编写一个简单的文字小游戏
  2. 发现U盘不显示盘符的解决办法
  3. 干货 | 足式机器人运动控制发展方向——轨迹优化
  4. mysql 数据分组_详解MySQL 数据分组
  5. 2022必读的5篇行业趋势报告(内附下载)
  6. BUUCTF rsarsa
  7. 校园建设的一个实例:校园网规划与设计
  8. 360搜索是废了还是彻底商业化了?
  9. 计算机副教授工作,评副教授的基本条件
  10. 什么是电压跟随器?电压跟随器计算方法讲解