android滑动按钮事件

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

首先效果图:

android滑动按钮事件_第1张图片


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

main.class

[c-sharp:nogutter] view plain copy print ?
  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. }  
import android.app.Activity; import android.os.Bundle; import android.widget.Toast; public class Main extends Activity implements OnChangedListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);//获得指定控件 myBtn.SetOnChangedListener(this);//为控件设置监听器 } @Override public void OnChanged(boolean CheckState) {//当按钮状态被改变时 // TODO Auto-generated method stub if(CheckState) Toast.makeText(this,"打开了..." , Toast.LENGTH_SHORT).show(); else Toast.makeText(this,"关闭了..." , Toast.LENGTH_SHORT).show(); } }

SlipButton.class

[c-sharp] view plain copy print ?
  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. }  
import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; public class SlipButton extends View implements OnTouchListener{ private boolean NowChoose = false;//记录当前按钮是否打开,true为打开,flase为关闭 private boolean OnSlip = false;//记录用户是否在滑动的变量 private float DownX,NowX;//按下时的x,当前的x, private Rect Btn_On,Btn_Off;//打开和关闭状态下,游标的Rect private boolean isChgLsnOn = false; private OnChangedListener ChgLsn; private Bitmap bg_on,bg_off,slip_btn; public SlipButton(Context context) { super(context); // TODO Auto-generated constructor stub init(); } public SlipButton(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(); } private void init(){//初始化 //载入图片资源 bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_on); bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_off); slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.slip_btn); //获得需要的Rect数据 Btn_On = new Rect(0,0,slip_btn.getWidth(),slip_btn.getHeight()); Btn_Off = new Rect( bg_off.getWidth()-slip_btn.getWidth(), 0, bg_off.getWidth(), slip_btn.getHeight()); setOnTouchListener(this);//设置监听器,也可以直接复写OnTouchEvent } @Override protected void onDraw(Canvas canvas) {//绘图函数 // TODO Auto-generated method stub super.onDraw(canvas); Matrix matrix = new Matrix(); Paint paint = new Paint(); float x; { if(NowX<(bg_on.getWidth()/2))//滑动到前半段与后半段的背景不同,在此做判断 canvas.drawBitmap(bg_off,matrix, paint);//画出关闭时的背景 else canvas.drawBitmap(bg_on,matrix, paint);//画出打开时的背景 if(OnSlip)//是否是在滑动状态, { if(NowX >= bg_on.getWidth())//是否划出指定范围,不能让游标跑到外头,必须做这个判断 x = bg_on.getWidth()-slip_btn.getWidth()/2;//减去游标1/2的长度... else x = NowX - slip_btn.getWidth()/2; }else{//非滑动状态 if(NowChoose)//根据现在的开关状态设置画游标的位置 x = Btn_Off.left; else x = Btn_On.left; } if(x<0)//对游标位置进行异常判断... x = 0; else if(x>bg_on.getWidth()-slip_btn.getWidth()) x = bg_on.getWidth()-slip_btn.getWidth(); canvas.drawBitmap(slip_btn,x, 0, paint);//画出游标. } } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch(event.getAction())//根据动作来执行代码 { case MotionEvent.ACTION_MOVE://滑动 NowX = event.getX(); break; case MotionEvent.ACTION_DOWN://按下 if(event.getX()>bg_on.getWidth()||event.getY()>bg_on.getHeight()) return false; OnSlip = true; DownX = event.getX(); NowX = DownX; break; case MotionEvent.ACTION_UP://松开 OnSlip = false; boolean LastChoose = NowChoose; if(event.getX()>=(bg_on.getWidth()/2)) NowChoose = true; else NowChoose = false; if(isChgLsnOn&&(LastChoose!=NowChoose))//如果设置了监听器,就调用其方法.. ChgLsn.OnChanged(NowChoose); break; default: } invalidate();//重画控件 return true; } public void SetOnChangedListener(OnChangedListener l){//设置监听器,当状态修改的时候 isChgLsnOn = true; ChgLsn = l; } }

 

 onchangeListener.class

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

main.xml代码

 

[c-sharp] view plain copy print ?
  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 version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <LinearLayout android:orientation = "horizontal" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:background = "#ff0000" > <TextView android:text = "测试:" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> <CMD100.demo.slipButton.SlipButton android:id = "@+id/slipBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft = "10sp" /> </LinearLayout> </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滑动按钮事件)