android 滑動按鈕

在android4.0以上的版本中提供了一個新的控件switch,可以在它的setOnCheckedChangeListener事件中判斷按鈕當前的狀態,從而寫響應事件。

在android4.0以下的版本沒有這個控件,可以自定義

首先效果圖:


然後是分別建立三個文件,第一個是main.class,第二個是SlipButton.class,第三個是 onchangeListener.class

main.class

    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

    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
  1. package CMD100.demo.slipButton;  
  2.   
  3. public interface OnChangedListener {  
  4.     abstract void OnChanged(boolean CheckState);  
  5. }  

main.xml代碼

    <?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(...);

代碼到這裏就全部完成了。

發佈了50 篇原創文章 · 獲贊 10 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章