【android开发】滑动按钮 SlipSwitch开关的实现

来源:互联网 发布:网络传输速率表示方法 编辑:程序博客网 时间:2024/05/19 05:30

       项目新加入一个网络模式选择的功能,要求实现一个类似于开关的效果,在网上查了查了一些资料,看到有很多例子,大家完全可以拿来用,当然了,自己掌握了才是自己的东西,现在把我用的分享给大家,希望能帮助一些朋友!下面上图,看一下效果:


其实这个开关实现起来确实很简单,下面把一下代码贴出来:

准备两张图片

    

这两张图,下载可以直接使用。

新建一个MySlipSwitch类:

------------------------------------------------------------------------------------

[java] view plaincopy
  1. package com.tp.insurance.util;  
  2.   
  3.   
  4. import android.content.Context;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.BitmapFactory;  
  7. import android.graphics.Canvas;  
  8. import android.graphics.Matrix;  
  9. import android.graphics.Paint;  
  10. import android.graphics.Rect;  
  11. import android.util.AttributeSet;  
  12. import android.view.MotionEvent;  
  13. import android.view.View;  
  14. import android.view.View.OnTouchListener;  
  15. /** 
  16.  * 类名称:MySlipSwitch  
  17.  * 类描述:设置中的网络连接功能手动模式自定义开关 
  18.  * 创建人:LiXinhui  
  19.  * 创建时间:2013-10-16 上午10:20:00  
  20.  */  
  21. public class MySlipSwitch extends View implements OnTouchListener{  
  22.   
  23.   
  24. //开关开启时的背景,关闭时的背景,滑动按钮  
  25. private Bitmap switch_on_Bkg, switch_off_Bkg, slip_Btn;  
  26. private Rect on_Rect, off_Rect;  
  27. //是否正在滑动  
  28. private boolean isSlipping = false;  
  29. //当前开关状态,true为开启,false为关闭  
  30. private boolean isSwitchOn = false;  
  31. //手指按下时的水平坐标X,当前的水平坐标X  
  32. private float previousX, currentX;  
  33. //开关监听器  
  34. private OnSwitchListener onSwitchListener;  
  35. //是否设置了开关监听器  
  36. private boolean isSwitchListenerOn = false;  
  37. public MySlipSwitch(Context context) {  
  38. super(context);  
  39. init();  
  40. }  
  41. public MySlipSwitch(Context context, AttributeSet attrs) {  
  42. super(context, attrs);  
  43. init();  
  44. }  
  45. private void init() {  
  46. setOnTouchListener(this);  
  47. }  
  48. public void setImageResource(int switchOnBkg, int switchOffBkg, int slipBtn) {  
  49. switch_on_Bkg = BitmapFactory.decodeResource(getResources(), switchOnBkg);  
  50. switch_off_Bkg = BitmapFactory.decodeResource(getResources(), switchOffBkg);  
  51. slip_Btn = BitmapFactory.decodeResource(getResources(), slipBtn);  
  52. //右半边Rect,即滑动按钮在右半边时表示开关开启  
  53. on_Rect = new Rect(switch_off_Bkg.getWidth() - slip_Btn.getWidth(), 0, switch_off_Bkg.getWidth(), slip_Btn.getHeight());  
  54. //左半边Rect,即滑动按钮在左半边时表示开关关闭  
  55. off_Rect = new Rect(00, slip_Btn.getWidth(), slip_Btn.getHeight());  
  56. }  
  57. public void setSwitchState(boolean switchState) {  
  58. isSwitchOn = switchState;  
  59. }  
  60. protected boolean getSwitchState() {  
  61. return isSwitchOn;  
  62. }  
  63. protected void updateSwitchState(boolean switchState) {  
  64. isSwitchOn = switchState;  
  65. invalidate();  
  66. }  
  67. @Override  
  68. protected void onDraw(Canvas canvas) {  
  69. // TODO Auto-generated method stub  
  70. super.onDraw(canvas);  
  71.   
  72. Matrix matrix = new Matrix();  
  73. Paint paint = new Paint();  
  74. //滑动按钮的左边坐标  
  75. float left_SlipBtn;  
  76. //手指滑动到左半边的时候表示开关为关闭状态,滑动到右半边的时候表示开关为开启状态  
  77. if(currentX < (switch_on_Bkg.getWidth() / 2)) {  
  78. canvas.drawBitmap(switch_off_Bkg, matrix, paint);  
  79. else {  
  80. canvas.drawBitmap(switch_on_Bkg, matrix, paint);  
  81. }  
  82.   
  83. //判断当前是否正在滑动  
  84. if(isSlipping) {  
  85. if(currentX > switch_on_Bkg.getWidth()) {  
  86. left_SlipBtn = switch_on_Bkg.getWidth() - slip_Btn.getWidth();  
  87. else {  
  88. left_SlipBtn = currentX - slip_Btn.getWidth() / 2;  
  89. }  
  90. else {  
  91. //根据当前的开关状态设置滑动按钮的位置  
  92. if(isSwitchOn) {  
  93. left_SlipBtn = on_Rect.left;  
  94. else {  
  95. left_SlipBtn = off_Rect.left;  
  96. }  
  97. }  
  98. //对滑动按钮的位置进行异常判断  
  99. if(left_SlipBtn < 0) {  
  100. left_SlipBtn = 0;  
  101. else if(left_SlipBtn > switch_on_Bkg.getWidth() - slip_Btn.getWidth()) {  
  102. left_SlipBtn = switch_on_Bkg.getWidth() - slip_Btn.getWidth();  
  103. }  
  104. canvas.drawBitmap(slip_Btn, left_SlipBtn, 0, paint);  
  105. }  
  106. @Override  
  107. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  108. // TODO Auto-generated method stub  
  109. setMeasuredDimension(switch_on_Bkg.getWidth(), switch_on_Bkg.getHeight());  
  110. }  
  111. @Override  
  112. public boolean onTouch(View v, MotionEvent event) {  
  113. // TODO Auto-generated method stub  
  114. switch(event.getAction()) {  
  115. //滑动  
  116. case MotionEvent.ACTION_MOVE:  
  117. currentX = event.getX();  
  118. break;   
  119. //按下  
  120. case MotionEvent.ACTION_DOWN:  
  121. if(event.getX() > switch_on_Bkg.getWidth() || event.getY() > switch_on_Bkg.getHeight()) {  
  122. return false;  
  123. }   
  124. isSlipping = true;  
  125. previousX = event.getX();  
  126. currentX = previousX;  
  127. break;  
  128. //松开  
  129. case MotionEvent.ACTION_UP:  
  130. isSlipping = false;  
  131. //松开前开关的状态  
  132. boolean previousSwitchState  = isSwitchOn;  
  133. if(event.getX() >= (switch_on_Bkg.getWidth() / 2)) {  
  134. isSwitchOn = true;  
  135. else {  
  136. isSwitchOn = false;  
  137. }  
  138. //如果设置了监听器,则调用此方法  
  139. if(isSwitchListenerOn && (previousSwitchState != isSwitchOn)) {  
  140. onSwitchListener.onSwitched(isSwitchOn);  
  141. }  
  142. break;  
  143. default:  
  144. break;  
  145. }  
  146. //重新绘制控件  
  147. invalidate();  
  148. return true;  
  149. }  
  150. public void setOnSwitchListener(OnSwitchListener listener) {  
  151. onSwitchListener = listener;  
  152. isSwitchListenerOn = true;  
  153. }  
  154. public interface OnSwitchListener {  
  155. abstract void onSwitched(boolean isSwitchOn);  
  156. }  
  157. }  

-------------------------------------------------------------------------------------

然后在一个布局文件中添加一个控件select_network.xml:

-------------------------------------------------------------------------------------

[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:background="@drawable/viewbackground"  
  6.     android:orientation="vertical" >  
  7.     <include  
  8.         android:id="@+id/settings_modify_pwd"  
  9.         layout="@layout/title_normal1" />  
  10.     <LinearLayout  
  11.         android:layout_width="fill_parent"  
  12.         android:layout_height="wrap_content"   
  13.         android:layout_marginTop="100dp"  
  14.         android:orientation="vertical">  
  15.         <LinearLayout  
  16.             android:layout_width="fill_parent"  
  17.             android:layout_height="wrap_content"  
  18.             android:layout_gravity="center_horizontal"  
  19.             android:background="@drawable/username_background"  
  20.             android:gravity="center_vertical"  
  21.             android:orientation="horizontal" >  
  22.             <ImageView  
  23.                 android:layout_width="0px"  
  24.                 android:layout_weight="1"  
  25.                 android:layout_height="wrap_content"  
  26.                 android:layout_marginLeft="20dp"  
  27.                 android:background="@drawable/hand_movement" />  
  28.             <TextView  
  29.                 android:layout_width="0px"  
  30.                 android:layout_weight="4"  
  31.                 android:layout_height="wrap_content"  
  32.                 android:text="手动模式"  
  33.                 android:layout_marginLeft="10dp"  
  34.                 android:textColor="#000000"  
  35.                 android:textSize="21dp" />  
  36.           <View  
  37.        android:layout_width="1dip"  
  38.        android:layout_height="match_parent"  
  39.        android:layout_marginLeft="20dp"  
  40.        android:background="#ff00ff66" />  
  41.              
  42. <com.tp.insurance.util.MySlipSwitch  
  43.   android:id="@+id/mss_select_network"  
  44.   android:layout_width="0px"  
  45.   android:layout_weight="4"  
  46.   android:layout_height="wrap_content"  
  47.   android:layout_marginLeft="40dp"  
  48.   android:layout_marginRight="5dp" />  
  49.         </LinearLayout>  
  50.         <LinearLayout  
  51.             android:id="@+id/ll_apn"  
  52.             android:layout_width="fill_parent"  
  53.             android:layout_height="wrap_content"  
  54.             android:layout_gravity="center_horizontal"  
  55.             android:background="@drawable/password_background"  
  56.             android:gravity="center_vertical"  
  57.             android:orientation="horizontal" >  
  58.        <RadioGroup  
  59.            android:id="@+id/rg_select_network"   
  60.            android:layout_width="wrap_content"  
  61.            android:layout_height="wrap_content"  
  62.            android:orientation="vertical"  
  63.            android:layout_marginLeft="15dp">  
  64.            <RadioButton  
  65.                android:id="@+id/rb_outnet"   
  66.                android:layout_width="wrap_content"  
  67.                android:layout_height="wrap_content"  
  68.                android:text="外网连接"  
  69.                android:textSize="20dp"  
  70.                />  
  71.            <RadioButton  
  72.                android:id="@+id/rb_apn"   
  73.                android:layout_width="wrap_content"  
  74.                android:layout_height="wrap_content"  
  75.                android:text="APN连接"  
  76.                android:textSize="20dp"  
  77.                />  
  78.        </RadioGroup>  
  79.         </LinearLayout>  
  80.     </LinearLayout>  
  81. </RelativeLayout>  

------------------------------------------------------------------------------------

最后在activity中绑定、监听就行,和使用其他的控件的操作基本就一样了SelectNetworkActivity.java:

注意,我的这个activity是通过其他activity调用的。

--------------------------------------------------------------------------------------

[java] view plaincopy
  1. package com.tp.insurance.ui;  
  2.   
  3. import com.tp.insurance.R;  
  4. import com.tp.insurance.util.MySlipSwitch;  
  5. import com.tp.insurance.util.MySlipSwitch.OnSwitchListener;  
  6. import com.tp.insurance.util.Util;  
  7. import android.annotation.SuppressLint;  
  8. import android.app.Activity;  
  9. import android.content.SharedPreferences;  
  10. import android.content.SharedPreferences.Editor;  
  11. import android.os.Bundle;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.widget.ImageView;  
  15. import android.widget.RadioButton;  
  16. import android.widget.RadioGroup;  
  17. import android.widget.RadioGroup.OnCheckedChangeListener;  
  18. import android.widget.Toast;  
  19. /** 
  20.  * 类名称:SelectNetworkActivity  
  21.  * 类描述:设置中的网络连接功能 
  22.  * 创建人:LiXinhui  
  23.  * 创建时间:2013-10-16 上午10:30:00  
  24.  */  
  25. public class SelectNetworkActivity extends Activity implements OnCheckedChangeListener{  
  26.   
  27. private ImageView title_back;//返回上一级  
  28. private MySlipSwitch slipswitch_MSL;//自定义开关  
  29. private RadioGroup isOpenWLAN;  
  30. private RadioButton rbOpenOutNet;  
  31. private RadioButton rbOpenAPN;  
  32. private SharedPreferences sharedPreferences;  
  33. private int isManual;//存放模式,0为自动模式,1为手动模式  
  34. private int selectNetWork;//存放网络方式,0为外网连接,1为APN连接  
  35. private Editor editor;  
  36. @SuppressLint("ShowToast")  
  37. @Override  
  38. protected void onCreate(Bundle savedInstanceState) {  
  39. // TODO Auto-generated method stub  
  40. super.onCreate(savedInstanceState);  
  41. setContentView(R.layout.select_network);  
  42. initView();  
  43.         slipswitch_MSL.setOnSwitchListener(new OnSwitchListener() {  
  44. @Override  
  45. public void onSwitched(boolean isSwitchOn) {  
  46. // TODO Auto-generated method stub  
  47. if(isSwitchOn) {  
  48. editor.putInt("isManual"1);  
  49. editor.commit(); // 提交数据, 保存到文件  
  50. if(selectNetWork == 0){  
  51. rbOpenOutNet.setChecked(true);  
  52. }else{  
  53. rbOpenAPN.setChecked(true);  
  54. }  
  55. rbOpenOutNet.setEnabled(true);  
  56. rbOpenAPN.setEnabled(true);  
  57. Toast.makeText(SelectNetworkActivity.this"手动模式"300).show();  
  58. else {  
  59. editor.putInt("isManual"0);  
  60. editor.commit(); // 提交数据, 保存到文件  
  61. rbOpenOutNet.setEnabled(false);  
  62. rbOpenAPN.setEnabled(false);  
  63. Toast.makeText(SelectNetworkActivity.this"自动模式"300).show();  
  64. }  
  65. }  
  66. });  
  67. }  
  68. @Override  
  69. public void onCheckedChanged(RadioGroup group, int checkedId) {  
  70. // TODO Auto-generated method stub  
  71. int getRadioButtonID = group.getCheckedRadioButtonId();  
  72. if(getRadioButtonID == R.id.rb_outnet){  
  73. editor.putInt("selectNetWork"0);//0是OutNet,1是APN  
  74. editor.commit();  
  75. }else{  
  76. editor.putInt("selectNetWork"1);//0是OutNet,1是APN  
  77. editor.commit();  
  78. }  
  79. }  
  80. //初始化UI  
  81. private void initView(){  
  82. //绑定相关控件的ID  
  83. title_back = (ImageView) findViewById(R.id.title_backBtn);  
  84. isOpenWLAN = (RadioGroup) findViewById(R.id.rg_select_network);  
  85. rbOpenOutNet = (RadioButton) findViewById(R.id.rb_outnet);  
  86. rbOpenAPN = (RadioButton) findViewById(R.id.rb_apn);  
  87. isOpenWLAN.setOnCheckedChangeListener(this);  
  88. slipswitch_MSL = (MySlipSwitch)findViewById(R.id.mss_select_network);  
  89. //数据保存到sharedPreferences文件中  
  90. sharedPreferences = getSharedPreferences("isManual",MODE_PRIVATE);  
  91. editor = sharedPreferences.edit();  
  92. isManual = sharedPreferences.getInt("isManual"0);  
  93. selectNetWork = sharedPreferences.getInt("selectNetWork"0);  
  94.         slipswitch_MSL.setImageResource(R.drawable.bkg_switch, R.drawable.bkg_switch, R.drawable.btn_slip);  
  95.         if(isManual == 0){  
  96.         slipswitch_MSL.setSwitchState(false);//开关为关闭状态  
  97.         rbOpenOutNet.setEnabled(false);  
  98. rbOpenAPN.setEnabled(false);  
  99.         }else{  
  100.         slipswitch_MSL.setSwitchState(true);//开关为开启状态  
  101.         if(selectNetWork == 0){  
  102. rbOpenOutNet.setChecked(true);  
  103. }else{  
  104. rbOpenAPN.setChecked(true);  
  105. }  
  106.         }  
  107.         title_back.setOnClickListener(new OnClickListener() {  
  108. @Override  
  109. public void onClick(View v) {  
  110. finish();  
  111. }  
  112. });  
  113. }  
  114. }  

-------------------------------------------------------------------------------------

主要实现过程就是上面的了,大家可以根据自己的需要,进行修改,已达到符合自己项目的要求呀!

版权声明:本文为博主原创文章,未经博主允许不得转载。

0 0
原创粉丝点击