android實現簡單的開關按鈕
阿新 • • 發佈:2019-02-20
自定義view和簡述介面回撥
自定義WiperSwitch類實現可拖動的開關按鈕
用到的3張圖片
/** * Created by 撩個小媳婦 on 2018/5/11. */ public class WiperSwitch extends View implements View.OnTouchListener { private Bitmap bg_on, bg_off, slipper_btn; /** * 按下時的x和當前的x */ private float downX, nowX; /** * 記錄使用者是否在滑動 */ private boolean onSlip = false; /** * 當前的狀態 */ private boolean nowStatus = false; /** * 監聽介面 */ private OnChangedListener listener; public WiperSwitch(Context context) { super(context); init(); } public WiperSwitch(Context context, AttributeSet attrs) { super(context, attrs); init(); } public void init(){ //載入圖片資源 bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.kai); bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.guan); slipper_btn = BitmapFactory.decodeResource(getResources(), R.drawable.dian); setOnTouchListener(this); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); Matrix matrix = new Matrix(); Paint paint = new Paint(); float x = 0; //根據nowX設定背景,開或者關狀態 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() - slipper_btn.getWidth()/2;//減去滑塊1/2的長度 else x = nowX - slipper_btn.getWidth()/2; }else { if(nowStatus){//根據當前的狀態設定滑塊的x值 x = bg_on.getWidth() - slipper_btn.getWidth(); }else{ x = 0; } } //對滑塊滑動進行異常處理,不能讓滑塊出界 if (x < 0 ){ x = 0; } else if(x > bg_on.getWidth() - slipper_btn.getWidth()){ x = bg_on.getWidth() - slipper_btn.getWidth(); } //畫出滑塊 canvas.drawBitmap(slipper_btn, x , 0, paint); } @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN:{ if (event.getX() > bg_off.getWidth() || event.getY() > bg_off.getHeight()){ return false; }else{ onSlip = true; downX = event.getX(); nowX = downX; } break; } case MotionEvent.ACTION_MOVE:{ nowX = event.getX(); break; } case MotionEvent.ACTION_UP:{ onSlip = false; if(event.getX() >= (bg_on.getWidth()/2)){ nowStatus = true; nowX = bg_on.getWidth() - slipper_btn.getWidth(); }else{ nowStatus = false; nowX = 0; } if(listener != null){ listener.OnChanged(WiperSwitch.this, nowStatus); } break; } } //重新整理介面 invalidate(); return true; } /** * 為WiperSwitch設定一個監聽,供外部呼叫的方法 */ public void setOnChangedListener(OnChangedListener listener){ this.listener = listener; } /** * 設定滑動開關的初始狀態,供外部呼叫 */ public void setChecked(boolean checked){ if(checked){ nowX = bg_off.getWidth(); }else{ nowX = 0; } nowStatus = checked; } /** * 回撥介面 * */ public interface OnChangedListener { public void OnChanged(WiperSwitch wiperSwitch, boolean checkState); } }
接下來是MainActivity.java
public class MainActivity extends Activity implements WiperSwitch.OnChangedListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //例項化WiperSwitch WiperSwitch wiperSwitch = (WiperSwitch)findViewById(R.id.wiperSwitch1); //設定初始狀態為false wiperSwitch.setChecked(false); //設定監聽 wiperSwitch.setOnChangedListener(this); } @Override public void OnChanged(WiperSwitch wiperSwitch, boolean checkState) { if (checkState){ Toast.makeText(MainActivity.this,"開關開啟了",Toast.LENGTH_SHORT).show(); }else if (!checkState){ Toast.makeText(MainActivity.this,"開關關閉了",Toast.LENGTH_SHORT).show(); } } }