我們都知道Android4.0以上才帶有滑動(dòng)開(kāi)關(guān)Switch,那么在4.0以下呢,很多人會(huì)選擇用CheckBox,放兩張圖片,但是這樣子只能點(diǎn)擊,效果不太好,所以我就自定義了滑動(dòng)開(kāi)關(guān)WiperSwitch這么一個(gè)控件,下面先把截圖貼上吧,這蹩腳的圖片真戳啊,大家可以自己換三張圖片
package com.example.wiperswitch;
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.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
/**
*
* @author xiaanming
*
*/
public class WiperSwitch extends View implements OnTouchListener{
private Bitmap bg_on, bg_off, slipper_btn;
/**
* 按下時(shí)的x和當(dāng)前的x
*/
private float downX, nowX;
/**
* 記錄用戶是否在滑動(dòng)
*/
private boolean onSlip = false;
/**
* 當(dāng)前的狀態(tài)
*/
private boolean nowStatus = false;
/**
* 監(jiān)聽(tīng)接口
*/
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.on_btn);
bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.off_btn);
slipper_btn = BitmapFactory.decodeResource(getResources(), R.drawable.white_btn);
setOnTouchListener(this);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Matrix matrix = new Matrix();
Paint paint = new Paint();
float x = 0;
//根據(jù)nowX設(shè)置背景,開(kāi)或者關(guān)狀態(tài)
if (nowX < (bg_on.getWidth()/2)){
canvas.drawBitmap(bg_off, matrix, paint);//畫(huà)出關(guān)閉時(shí)的背景
}else{
canvas.drawBitmap(bg_on, matrix, paint);//畫(huà)出打開(kāi)時(shí)的背景
}
if (onSlip) {//是否是在滑動(dòng)狀態(tài),
if(nowX >= bg_on.getWidth())//是否劃出指定范圍,不能讓滑塊跑到外頭,必須做這個(gè)判斷
x = bg_on.getWidth() - slipper_btn.getWidth()/2;//減去滑塊1/2的長(zhǎng)度
else
x = nowX - slipper_btn.getWidth()/2;
}else {
if(nowStatus){//根據(jù)當(dāng)前的狀態(tài)設(shè)置滑塊的x值
x = bg_on.getWidth() - slipper_btn.getWidth();
}else{
x = 0;
}
}
//對(duì)滑塊滑動(dòng)進(jìn)行異常處理,不能讓滑塊出界
if (x < 0 ){
x = 0;
}
else if(x > bg_on.getWidth() - slipper_btn.getWidth()){
x = bg_on.getWidth() - slipper_btn.getWidth();
}
//畫(huà)出滑塊
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設(shè)置一個(gè)監(jiān)聽(tīng),供外部調(diào)用的方法
* @param listener
*/
public void setOnChangedListener(OnChangedListener listener){
this.listener = listener;
}
/**
* 設(shè)置滑動(dòng)開(kāi)關(guān)的初始狀態(tài),供外部調(diào)用
* @param checked
*/
public void setChecked(boolean checked){
if(checked){
nowX = bg_off.getWidth();
}else{
nowX = 0;
}
nowStatus = checked;
}
/**
* 回調(diào)接口
* @author len
*
*/
public interface OnChangedListener {
public void OnChanged(WiperSwitch wiperSwitch, boolean checkState);
}
}
用法是,先定義XML文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.wiperswitch.WiperSwitch
android:id="@+id/wiperSwitch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
新建一個(gè)Activity
package com.example.wiperswitch;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.example.wiperswitch.WiperSwitch.OnChangedListener;
public class MainActivity extends Activity implements OnChangedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//實(shí)例化WiperSwitch
WiperSwitch wiperSwitch = (WiperSwitch)findViewById(R.id.wiperSwitch1);
//設(shè)置初始狀態(tài)為false
wiperSwitch.setChecked(false);
//設(shè)置監(jiān)聽(tīng)
wiperSwitch.setOnChangedListener(this);
}
@Override
public void OnChanged(WiperSwitch wiperSwitch, boolean checkState) {
Log.e("log", "" + checkState);
}
}
代碼全部上完了,寫(xiě)的不好的地方歡迎大牛指點(diǎn)!
哦,忘記了還有三張蹩腳的圖片沒(méi)傳
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

