自定义控件之仿IOS的ToggleButton

1、MyToggleButton.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.cbitcn.togglebuttondemo;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Canvas;  
  7. import android.util.AttributeSet;  
  8. import android.view.MotionEvent;  
  9. import android.view.View;  
  10.   
  11. public class MyToggleButton extends View {  
  12.     private Bitmap backgroundBmp; // 背景图片  
  13.     private Bitmap slideButtonBmp; // 滑动按钮  
  14.     private boolean open; // 是否打开  
  15.     private int pressX; // 按下的X坐标  
  16.     private boolean isSlide = false//判断当前是否处于滑动状态  
  17.     private ToggleButtonCheckListener toggleButtonCheckListener;  
  18.   
  19.     public MyToggleButton(Context context, AttributeSet attrs) {  
  20.         super(context, attrs);  
  21.     }  
  22.   
  23.     public void setToggleButtonBackGround(int background, int slideButton) {  
  24.         backgroundBmp = BitmapFactory  
  25.                 .decodeResource(getResources(), background);  
  26.         slideButtonBmp = BitmapFactory.decodeResource(getResources(),  
  27.                 slideButton);  
  28.     }  
  29.   
  30.     /** 
  31.      * 初始化当前ToggleButton的状态 
  32.      * @param open 
  33.      */  
  34.     public void initStatus(boolean open) {  
  35.         this.open = open;  
  36.     }  
  37.       
  38.     /** 
  39.      * 设置监听器 
  40.      * @param toggleButtonCheckListener 
  41.      */  
  42.     public void setListener(ToggleButtonCheckListener toggleButtonCheckListener){  
  43.         this.toggleButtonCheckListener = toggleButtonCheckListener;  
  44.     }  
  45.   
  46.     /** 
  47.      * 该方法是其父控件用来测量当前控件的大小,父控件调用时传入的两个参数是宽度和高度的规格 
  48.      * 一共有三种模式, 
  49.      * UNSPECIFIED 
  50.      * EXACTLY,match_parent和具体数值的大小对应这种模式 
  51.      * AT_MOST,wrap_content对应这种模式 
  52.      */  
  53.     @Override  
  54.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  55.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  56.         // 设置该控制MyToggleButton的大小  
  57.         setMeasuredDimension(backgroundBmp.getWidth(),  
  58.                 backgroundBmp.getHeight());  
  59.     }  
  60.   
  61.     /** 
  62.      * 控件的显示就是调用该方法绘制出来的 
  63.      */  
  64.     @Override  
  65.     protected void onDraw(Canvas canvas) {  
  66.         super.onDraw(canvas);  
  67.         // 绘制背景,第二和第三个参数,绘制的背景相对于该控件的顶部和左边的距离  
  68.         canvas.drawBitmap(backgroundBmp, 00null);  
  69.         // 绘制滑动按钮  
  70.         if (isSlide) {  
  71.             int left = pressX - slideButtonBmp.getWidth() / 2;  
  72.             if (left < 0) {  
  73.                 left = 0;  
  74.             } else if (left > backgroundBmp.getWidth()  
  75.                     - slideButtonBmp.getWidth()) {  
  76.                 left = backgroundBmp.getWidth() - slideButtonBmp.getWidth();  
  77.             }  
  78.             canvas.drawBitmap(slideButtonBmp, left, 0null);  
  79.         } else {  
  80.             if (open) {  
  81.                 canvas.drawBitmap(slideButtonBmp, backgroundBmp.getWidth()  
  82.                         - slideButtonBmp.getWidth(), 0null);  
  83.             } else {  
  84.                 canvas.drawBitmap(slideButtonBmp, 00null);  
  85.             }  
  86.             //回调  
  87.             toggleButtonCheckListener.check(open);  
  88.         }  
  89.     }  
  90.   
  91.     @Override  
  92.     public boolean onTouchEvent(MotionEvent event) {  
  93.         pressX = (int) event.getX();  
  94.   
  95.         switch (event.getAction()) {  
  96.         case MotionEvent.ACTION_DOWN:  
  97.             isSlide = true;  
  98.             break;  
  99.         case MotionEvent.ACTION_MOVE:  
  100.   
  101.             break;  
  102.         case MotionEvent.ACTION_UP:  
  103.             isSlide = false;  
  104.             int middle = backgroundBmp.getWidth() / 2;  
  105.             if (pressX < middle) {  
  106.                 open = false;  
  107.             } else {  
  108.                 open = true;  
  109.             }  
  110.             break;  
  111.   
  112.         default:  
  113.             break;  
  114.         }  
  115.         // 手动执行onDraw方法  
  116.         invalidate();  
  117.         return true;  
  118.     }  
  119.       
  120.     /** 
  121.      * 回调接口 
  122.      * @author Administrator 
  123.      * 
  124.      */  
  125.     public interface ToggleButtonCheckListener {  
  126.         public void check(boolean status);  
  127.     }  
  128.   
  129. }  

2、MainActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     private MyToggleButton toggleButton;  
  3.   
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.         toggleButton = (MyToggleButton) findViewById(R.id.toggle_button);  
  9.         toggleButton.setToggleButtonBackGround(R.drawable.switch_background,  
  10.                 R.drawable.slide_button_background);  
  11.         toggleButton.initStatus(false);  
  12.   
  13.         toggleButton.setListener(new ToggleButtonCheckListener() {  
  14.             @Override  
  15.             public void check(boolean status) {  
  16.                 if (status) {  
  17.                     Toast.makeText(MainActivity.this"打开", Toast.LENGTH_SHORT)  
  18.                             .show();  
  19.                 } else {  
  20.                     Toast.makeText(MainActivity.this"关闭", Toast.LENGTH_SHORT)  
  21.                             .show();  
  22.                 }  
  23.             }  
  24.         });  
  25.     }  
  26.   
  27. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值