android 自定義SwitchButton 開關狀態
阿新 • • 發佈:2019-02-04
//自定義類繼承View
public class SwitchButton extends View {
private Bitmap back;
private Bitmap slide;
private int currentX;//處理事件
private boolean isTouch;//判斷是否在觸控狀態
private boolean state;//開關的狀態
private OnStateChangeListener onStateChangeListener;//監聽物件 介面物件
//new的時候呼叫
public SwitchButton(Context context) {
this(context,null);
}
//使用style的使用呼叫
public SwitchButton(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
//寫在佈局檔案裡面的時候呼叫
public SwitchButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//初始化兩張圖片
//將資源 檔案轉成Bitmap物件
//getResources() 包含圖片資源的資源物件
//R.drawable.background 圖片資源的id
back = BitmapFactory.decodeResource(getResources(), R.drawable.background);
slide = BitmapFactory.decodeResource(getResources(), R.drawable.slide);
}
//將圖片繪製到控制元件上面
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//繪製
//引數1.圖片物件
//引數2.x軸的開始位置
//引數3.y軸的開始位置
//引數4.畫筆
canvas.drawBitmap(back,0,0,null);
int left = 0;
if(isTouch){
//滑塊和手指一起移動
//判斷是否在觸控狀態
left = currentX;//修正位置
left = currentX - slide.getWidth() / 2;
//處理邊界問題
if(left<0){
left=0;
}
if(left>back.getWidth()-slide.getWidth()){
left=back.getWidth()-slide.getWidth();
}
canvas.drawBitmap(slide, left, 0, null);//滑塊兒
}else{
//根據開關的狀態繪製滑塊
if(state){
//getWidth()---背景的寬度
left=back.getWidth()-slide.getWidth();
}else{
left=0;
}
canvas.drawBitmap(slide, left, 0, null); //滑塊兒
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
currentX = (int) event.getX();
isTouch=true;
break;
case MotionEvent.ACTION_MOVE:
currentX = (int) event.getX();
isTouch=true;
break;
case MotionEvent.ACTION_UP:
isTouch=false;
currentX = (int) event.getX();
//當手指擡起的時候,應該判斷一下滑塊兒的位置,然後設定開關的狀態
//currentX 在中間位置的那邊
int centerX = back.getWidth()/2;//獲取圖片的寬度
//如果擡起時的位置大於圖片寬度的一半
if(currentX>centerX){
state = true;
}else{
state=false;
}
//呼叫接口裡的方法
onStateChangeListener.onStateChange(state);
break;
}
//重新繪製
invalidate();
return true;
}
//將控制元件的尺寸重新設定一下
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//根據背景圖設定控制元件的寬高
setMeasuredDimension(back.getWidth(),back.getHeight());//將需要的寬高設定進去
}
//介面回撥
public interface OnStateChangeListener{
void onStateChange(boolean state);
}
//提供一個外部訪問的方法
public void setOnStateChange(OnStateChangeListener onStateChangeListener){
this.onStateChangeListener = onStateChangeListener;
}
//給外部提供一個設定開關的方法
public void setState(boolean state) {
this.state = state;
}
public boolean getState(){
return state;
};
}
2.MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SwitchButton sb=findViewById(R.id.sb);
//在外部設定監聽
sb.setOnStateChange(new SwitchButton.OnStateChangeListener() {
@Override
public void onStateChange(boolean state) {
Toast.makeText(MainActivity.this,"當前狀態---"+state, Toast.LENGTH_SHORT).show();
}
});
}
}
3.佈局檔案<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.bwie.day04_switchbutton.MainActivity">
<com.bwie.day04_switchbutton.views.SwitchButton
android:id="@+id/sb"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>