Android UI(ToggleButton)详解
目录:
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)详解相关推荐
- android ui框架详解,多图详解 “Android UI”设计官方教程(二)
编者注:本文为Android的官方开发者博客发了一份幻灯片的翻译文档的第二部分,专门介绍了一些Android UI设计的小贴士,我们在介绍这个幻灯片的第一部分<多图详解 "Androi ...
- Android UI开发详解之ActionBar .
在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果. 一.添加A ...
- android switch 空间,android Android UI(Switch)详解
目录: 1.应用场景与概述 2.常用属性 3.简单使用 4.更改默认Switch的样式 5.自定义Switch 1.应用场景与概述 Switch是在4.0以后推出的,所以要注意开发时的minsdk设置 ...
- Android UI开发详解之ActionBar
原文地址:http://www.open-open.com/lib/view/open1373981182669.html 在Android3.0之后,Google对UI导航设计上进行了一系列的改革, ...
- android屏幕适配详解
android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...
- Android LiveData组件详解以及LiveDataBus
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/99749323 本文出自[赵彦军的博客] 一.LiveData简介 LiveDat ...
- Android Studio 插件开发详解一:入门练手
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112003 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...
- Android USB 开发详解
Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...
- Android中AMS工作原理,Android AMS启动详解
启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...
最新文章
- 程序员的岗位方向和所需技能都有哪些?
- 《强化学习周刊》第25期:DeepMind提出无模型风险敏感强化学习、谷歌发布 RLDS数据集生态系统...
- 2019.7.15随笔
- 洛谷 P1678 烦恼的高考志愿
- JAVA 判断其是否为合法标识符
- VTK:vtkCompositePolyDataMapper2用法实战
- netdev: dev_watchdog timer(结合stmmac 分析)
- 170905-MyBatis中的关系映射
- 设计模式之 - 代理模式(Proxy Pattern)
- Adobe Camera Raw13 for mac(PS Raw增效工具)支持M1
- C#日期格式化,时间
- 请写出至少五个块级元素_Java 面试题(五)
- 注解形式控制器 数据验证,类型转换(3)
- datasource dbcp 数据源_数据源--.dbcp.BasicDataSource 使用
- jdk lambda表达式的坑
- java ip范围_Java判断IP是否在指定范围
- eclipse快捷键使用
- Android仿人人客户端(v5.7.1)——有关滑动式左侧菜单实现过程中网友的疑问解答
- java 时区转换 转换成东八区 时间
- 新世纪版五笔字根高清版