Android 仿iphone的开关按钮

 今天纪录一下滑动按钮功能。。

首先效果图:

Android 仿iphone的开关按钮_第1张图片


然后是分别建立三个文件,第一个是main.class,第二个是SlipButton.class,第三个是 onchangeListener.class

main.class

[c-sharp:nogutter]  view plain copy
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.widget.Toast;  
  4.   
  5. public class Main extends Activity implements OnChangedListener {  
  6.     /** Called when the activity is first created. */  
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.           
  12.         SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);//获得指定控件  
  13.         myBtn.SetOnChangedListener(this);//为控件设置监听器  
  14.     }  
  15.   
  16.     @Override  
  17.     public void OnChanged(boolean CheckState) {//当按钮状态被改变时  
  18.         // TODO Auto-generated method stub  
  19.         if(CheckState)  
  20.             Toast.makeText(this,"打开了..." , Toast.LENGTH_SHORT).show();  
  21.         else  
  22.             Toast.makeText(this,"关闭了..." , Toast.LENGTH_SHORT).show();  
  23.     }  
  24. }  

SlipButton.class

[c-sharp]  view plain copy
  1. import android.content.Context;  
  2. import android.graphics.Bitmap;  
  3. import android.graphics.BitmapFactory;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Matrix;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Rect;  
  8. import android.util.AttributeSet;  
  9. import android.view.MotionEvent;  
  10. import android.view.View;  
  11. import android.view.View.OnTouchListener;  
  12.   
  13. public class SlipButton extends View implements OnTouchListener{  
  14.   
  15.     private boolean NowChoose = false;//记录当前按钮是否打开,true为打开,flase为关闭  
  16.     private boolean OnSlip = false;//记录用户是否在滑动的变量  
  17.     private float DownX,NowX;//按下时的x,当前的x,  
  18.     private Rect Btn_On,Btn_Off;//打开和关闭状态下,游标的Rect  
  19.       
  20.     private boolean isChgLsnOn = false;  
  21.     private OnChangedListener ChgLsn;  
  22.       
  23.     private Bitmap bg_on,bg_off,slip_btn;  
  24.       
  25.     public SlipButton(Context context) {  
  26.         super(context);  
  27.         // TODO Auto-generated constructor stub  
  28.         init();  
  29.     }  
  30.   
  31.     public SlipButton(Context context, AttributeSet attrs) {  
  32.         super(context, attrs);  
  33.         // TODO Auto-generated constructor stub  
  34.         init();  
  35.     }  
  36.   
  37.     private void init(){//初始化  
  38.         //载入图片资源  
  39.         bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_on);  
  40.         bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_off);  
  41.         slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.slip_btn);  
  42.         //获得需要的Rect数据  
  43.         Btn_On = new Rect(0,0,slip_btn.getWidth(),slip_btn.getHeight());  
  44.         Btn_Off = new Rect(  
  45.                 bg_off.getWidth()-slip_btn.getWidth(),  
  46.                 0,  
  47.                 bg_off.getWidth(),  
  48.                 slip_btn.getHeight());  
  49.         setOnTouchListener(this);//设置监听器,也可以直接复写OnTouchEvent  
  50.     }  
  51.       
  52.     @Override  
  53.     protected void onDraw(Canvas canvas) {//绘图函数  
  54.         // TODO Auto-generated method stub  
  55.         super.onDraw(canvas);  
  56.         Matrix matrix = new Matrix();  
  57.         Paint paint = new Paint();  
  58.         float x;  
  59.           
  60.         {  
  61.             if(NowX<(bg_on.getWidth()/2))//滑动到前半段与后半段的背景不同,在此做判断  
  62.                 canvas.drawBitmap(bg_off,matrix, paint);//画出关闭时的背景  
  63.             else  
  64.                 canvas.drawBitmap(bg_on,matrix, paint);//画出打开时的背景  
  65.               
  66.             if(OnSlip)//是否是在滑动状态,  
  67.             {  
  68.                 if(NowX >= bg_on.getWidth())//是否划出指定范围,不能让游标跑到外头,必须做这个判断  
  69.                     x = bg_on.getWidth()-slip_btn.getWidth()/2;//减去游标1/2的长度...  
  70.                 else  
  71.                     x = NowX - slip_btn.getWidth()/2;  
  72.             }else{//非滑动状态  
  73.                 if(NowChoose)//根据现在的开关状态设置画游标的位置  
  74.                     x = Btn_Off.left;  
  75.                 else  
  76.                     x = Btn_On.left;  
  77.             }  
  78.         if(x<0)//对游标位置进行异常判断...  
  79.             x = 0;  
  80.         else if(x>bg_on.getWidth()-slip_btn.getWidth())  
  81.             x = bg_on.getWidth()-slip_btn.getWidth();  
  82.         canvas.drawBitmap(slip_btn,x, 0, paint);//画出游标.  
  83.         }  
  84.     }  
  85.   
  86.   
  87.     @Override  
  88.     public boolean onTouch(View v, MotionEvent event) {  
  89.         // TODO Auto-generated method stub  
  90.         switch(event.getAction())//根据动作来执行代码  
  91.         {  
  92.         case MotionEvent.ACTION_MOVE://滑动  
  93.             NowX = event.getX();  
  94.             break;  
  95.         case MotionEvent.ACTION_DOWN://按下  
  96.         if(event.getX()>bg_on.getWidth()||event.getY()>bg_on.getHeight())  
  97.             return false;  
  98.             OnSlip = true;  
  99.             DownX = event.getX();  
  100.             NowX = DownX;  
  101.             break;  
  102.         case MotionEvent.ACTION_UP://松开  
  103.             OnSlip = false;  
  104.             boolean LastChoose = NowChoose;  
  105.             if(event.getX()>=(bg_on.getWidth()/2))  
  106.                 NowChoose = true;  
  107.             else  
  108.                 NowChoose = false;  
  109.             if(isChgLsnOn&&(LastChoose!=NowChoose))//如果设置了监听器,就调用其方法..  
  110.                 ChgLsn.OnChanged(NowChoose);  
  111.             break;  
  112.         default:  
  113.           
  114.         }  
  115.         invalidate();//重画控件  
  116.         return true;  
  117.     }  
  118.       
  119.     public void SetOnChangedListener(OnChangedListener l){//设置监听器,当状态修改的时候  
  120.         isChgLsnOn = true;  
  121.         ChgLsn = l;  
  122.     }  
  123.       
  124. }  

 

 onchangeListener.class

[c-sharp]  view plain copy
  1. package CMD100.demo.slipButton;  
  2.   
  3. public interface OnChangedListener {  
  4.     abstract void OnChanged(boolean CheckState);  
  5. }  

main.xml代码

 

[c-sharp]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <TextView    
  8.     android:layout_width="fill_parent"   
  9.     android:layout_height="wrap_content"   
  10.     android:text="@string/hello"  
  11.     />  
  12. <LinearLayout  
  13.     android:orientation = "horizontal"  
  14.     android:layout_width = "fill_parent"  
  15.     android:layout_height = "wrap_content"  
  16.     android:background = "#ff0000"  
  17.     >  
  18.     <TextView  
  19.         android:text = "测试:"  
  20.         android:layout_width = "wrap_content"  
  21.         android:layout_height = "wrap_content"  
  22.         />  
  23.     <CMD100.demo.slipButton.SlipButton  
  24.         android:id = "@+id/slipBtn"  
  25.         android:layout_width="wrap_content"   
  26.         android:layout_height="wrap_content"  
  27.         android:layout_marginLeft = "10sp"   
  28.     />  
  29.       
  30. </LinearLayout>  
  31. </LinearLayout>  

 

注意:在xml里头要放置的位置

<[包名].SlipButton
        android:id = "@+id/slipBtn"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        />

然后可以像其他控件一样使用了...

SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);
myBtn.SetOnChangedListener(...);

代码到这里就全部完成了。

原创作者是:zcmmwbd

你可能感兴趣的:(Android 仿iphone的开关按钮)