1. 程式人生 > >Android 滑動開關控制元件

Android 滑動開關控制元件

效果預覽:
Android <wbr>滑動開關控制元件
Android <wbr>滑動開關控制元件

SlipButton.java
Java程式碼 收藏程式碼
  1. package com.iaiai.activity;  
  2. import android.content.Context;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.BitmapFactory;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Matrix;  
  7. import android.graphics.Paint;  
  8. import android.graphics.Rect;  
  9. import android.util.AttributeSet;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12. import android.view.View.OnTouchListener;  
  13. publicclass SlipButton extends View implements OnTouchListener {  
  14.     publicinterface OnChangedListener {  
  15.         abstractvoid OnChanged(String strName, 
    boolean CheckState);  
  16.     }  
  17.     private String strName;  
  18.     privateboolean enabled = true;  
  19.     publicboolean flag = false;// 設定初始化狀態
  20.     publicboolean NowChoose = false;// 記錄當前按鈕是否開啟,true為開啟,flase為關閉
  21.     privateboolean OnSlip = false;// 記錄使用者是否在滑動的變數
  22.     publicfloat DownX = 0f, NowX = 0f;// 按下時的x,當前的x,NowX>100時為ON背景,反之為OFF背景
  23.     private Rect Btn_On, Btn_Off;// 開啟和關閉狀態下,遊標的Rect
  24.     privateboolean isChgLsnOn = false;  
  25.     private OnChangedListener ChgLsn;  
  26.     private Bitmap bg_on, bg_off, slip_btn;  
  27.     public SlipButton(Context context) {  
  28.         super(context);  
  29.         init();  
  30.     }  
  31.     public SlipButton(Context context, AttributeSet attrs) {  
  32.         super(context, attrs);  
  33.         init();  
  34.     }  
  35.     publicvoid setChecked(boolean fl) {  
  36.         if (fl) {  
  37.             flag = true;  
  38.             NowChoose = true;  
  39.             NowX = 80;  
  40.         } else {  
  41.             flag = false;  
  42.             NowChoose = false;  
  43.             NowX = 0;  
  44.         }  
  45.     }  
  46.     publicvoid setEnabled(boolean b) {  
  47.         if (b) {  
  48.             enabled = true;  
  49.         } else {  
  50.             enabled = false;  
  51.         }  
  52.     }  
  53.     privatevoid init() {// 初始化
  54.         // 載入圖片資源
  55.         bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.on_btn);  
  56.         bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.off_btn);  
  57.         slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.white_btn);  
  58.         // 獲得需要的Rect資料
  59.         Btn_On = new Rect(00, slip_btn.getWidth(), slip_btn.getHeight());  
  60.         Btn_Off = new Rect(bg_off.getWidth() - slip_btn.getWidth(), 0, bg_off.getWidth(), slip_btn.getHeight());  
  61.         setOnTouchListener(this);// 設定監聽器,也可以直接複寫OnTouchEvent
  62.     }  
  63.     @Override
  64.     protectedvoid onDraw(Canvas canvas) {// 繪圖函式
  65.         super.onDraw(canvas);  
  66.         Matrix matrix = new Matrix();  
  67.         Paint paint = new Paint();  
  68.         float x;  
  69.         {  
  70.             if (flag) {  
  71.                 NowX = 80;  
  72.                 flag = false;  
  73.             }// bg_on.getWidth()=71
  74.             if (NowX < (bg_on.getWidth() / 2))// 滑動到前半段與後半段的背景不同,在此做判斷
  75.                 canvas.drawBitmap(bg_off, matrix, paint);// 畫出關閉時的背景
  76.             else
  77.                 canvas.drawBitmap(bg_on, matrix, paint);// 畫出開啟時的背景
  78.             if (OnSlip) {// 是否是在滑動狀態,
  79.                 if (NowX >= bg_on.getWidth())// 是否劃出指定範圍,不能讓遊標跑到外頭,必須做這個判斷
  80.                     x = bg_on.getWidth() - slip_btn.getWidth() / 2;// 減去遊標1/2的長度...
  81.                 else
  82.                     x = NowX - slip_btn.getWidth() / 2;  
  83.             } else {// 非滑動狀態
  84.                 if (NowChoose)// 根據現在的開關狀態設定畫遊標的位置
  85.                     x = Btn_Off.left;  
  86.                 else
  87.                     x = Btn_On.left;  
  88.             }  
  89.             if (x < 0)// 對遊標位置進行異常判斷...
  90.                 x = 0;  
  91.             elseif (x > bg_on.getWidth() - slip_btn.getWidth())  
  92.                 x = bg_on.getWidth() - slip_btn.getWidth();  
  93.             canvas.drawBitmap(slip_btn, x, 0, paint);// 畫出遊標.
  94.         }  
  95.     }  
  96.     publicboolean onTouch(View v, MotionEvent event) {  
  97.         if (!enabled) {  
  98.             returnfalse;  
  99.         }  
  100.         switch (event.getAction()) {// 根據動作來執行程式碼
  101.         case MotionEvent.ACTION_MOVE:// 滑動
  102.             NowX = event.getX();  
  103.             break;  
  104.         case MotionEvent.ACTION_DOWN:// 按下
  105.             if (event.getX() > bg_on.getWidth() || event.getY() > bg_on.getHeight())  
  106.                 returnfalse;  
  107.             OnSlip = true;  
  108.             DownX = event.getX();  
  109.             NowX = DownX;  
  110.             break;  
  111.         case MotionEvent.ACTION_UP:// 鬆開
  112.             OnSlip = false;  
  113.             boolean LastChoose = NowChoose;  
  114.             if (event.getX() >= (bg_on.getWidth() / 2))  
  115.                 NowChoose = true;  
  116.             else
  117.                 NowChoose = false;  
  118.             if (isChgLsnOn && (LastChoose != NowChoose))// 如果設定了監聽器,就呼叫其方法..
  119.                 ChgLsn.OnChanged(strName, NowChoose);  
  120.             break;  
  121.         default:  
  122.         }  
  123.         invalidate();// 重畫控制元件
  124.         returntrue;  
  125.     }  
  126.     publicvoid SetOnChangedListener(String name, OnChangedListener l) {// 設定監聽器,當狀態修改的時候
  127.         strName = name;  
  128.         isChgLsnOn = true;  
  129.         ChgLsn = l;  
  130.     }  
  131. }  


MainActivity.java Java程式碼