Android 滑動開關控制元件
阿新 • • 發佈:2019-02-07
效果預覽:
SlipButton.java
Java程式碼
MainActivity.java Java程式碼
SlipButton.java
Java程式碼
- package com.iaiai.activity;
- 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;
- publicclass SlipButton extends View implements OnTouchListener {
- publicinterface OnChangedListener {
-
abstractvoid OnChanged(String strName,
- }
- private String strName;
- privateboolean enabled = true;
- publicboolean flag = false;// 設定初始化狀態
- publicboolean NowChoose = false;// 記錄當前按鈕是否開啟,true為開啟,flase為關閉
- privateboolean OnSlip = false;// 記錄使用者是否在滑動的變數
-
publicfloat DownX = 0f, NowX = 0f;// 按下時的x,當前的x,NowX>100時為ON背景,反之為OFF背景
- private Rect Btn_On, Btn_Off;// 開啟和關閉狀態下,遊標的Rect
- privateboolean isChgLsnOn = false;
- private OnChangedListener ChgLsn;
- private Bitmap bg_on, bg_off, slip_btn;
- public SlipButton(Context context) {
- super(context);
- init();
- }
- public SlipButton(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- publicvoid setChecked(boolean fl) {
- if (fl) {
- flag = true;
- NowChoose = true;
- NowX = 80;
- } else {
- flag = false;
- NowChoose = false;
- NowX = 0;
- }
- }
- publicvoid setEnabled(boolean b) {
- if (b) {
- enabled = true;
- } else {
- enabled = false;
- }
- }
- privatevoid init() {// 初始化
- // 載入圖片資源
- bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.on_btn);
- bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.off_btn);
- slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.white_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
- protectedvoid onDraw(Canvas canvas) {// 繪圖函式
- super.onDraw(canvas);
- Matrix matrix = new Matrix();
- Paint paint = new Paint();
- float x;
- {
- if (flag) {
- NowX = 80;
- flag = false;
- }// bg_on.getWidth()=71
- 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;
- elseif (x > bg_on.getWidth() - slip_btn.getWidth())
- x = bg_on.getWidth() - slip_btn.getWidth();
- canvas.drawBitmap(slip_btn, x, 0, paint);// 畫出遊標.
- }
- }
- publicboolean onTouch(View v, MotionEvent event) {
- if (!enabled) {
- returnfalse;
- }
- 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())
- returnfalse;
- 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(strName, NowChoose);
- break;
- default:
- }
- invalidate();// 重畫控制元件
- returntrue;
- }
- publicvoid SetOnChangedListener(String name, OnChangedListener l) {// 設定監聽器,當狀態修改的時候
- strName = name;
- isChgLsnOn = true;
- ChgLsn = l;
- }
- }
MainActivity.java Java程式碼