android 自定义SwitchButton 开关状态

android 自定义SwitchButton 开关状态_第1张图片

//自定义类继承View

[java] view plain copy
  1. "font-size:18px;">public class SwitchButton extends View {  
  2.   
  3.     private Bitmap back;  
  4.     private Bitmap slide;  
  5.     private int currentX;//处理事件  
  6.     private boolean isTouch;//判断是否在触摸状态  
  7.     private boolean state;//开关的状态  
  8.     private OnStateChangeListener onStateChangeListener;//监听对象 接口对象  
  9.     //new的时候调用  
  10.     public SwitchButton(Context context) {  
  11.         this(context,null);  
  12.     }  
  13.     //使用style的使用调用  
  14.     public SwitchButton(Context context, @Nullable AttributeSet attrs) {  
  15.         this(context, attrs,0);  
  16.     }  
  17.     //写在布局文件里面的时候调用  
  18.     public SwitchButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {  
  19.         super(context, attrs, defStyleAttr);  
  20.         //初始化两张图片  
  21.         //将资源 文件转成Bitmap对象  
  22.         //getResources() 包含图片资源的资源对象  
  23.         //R.drawable.background 图片资源的id  
  24.         back = BitmapFactory.decodeResource(getResources(), R.drawable.background);  
  25.         slide = BitmapFactory.decodeResource(getResources(), R.drawable.slide);  
  26.   
  27.     }  
  28.     //将图片绘制到控件上面  
  29.   
  30.     @Override  
  31.     protected void onDraw(Canvas canvas) {  
  32.         super.onDraw(canvas);  
  33.         //绘制  
  34.         //参数1.图片对象  
  35.         //参数2.x轴的开始位置  
  36.         //参数3.y轴的开始位置  
  37.         //参数4.画笔  
  38.         canvas.drawBitmap(back,0,0,null);  
  39.         int left = 0;  
  40.             if(isTouch){  
  41.                 //滑块和手指一起移动  
  42.                 //判断是否在触摸状态  
  43.                 left = currentX;//修正位置  
  44.                 left = currentX - slide.getWidth() / 2;  
  45.                 //处理边界问题  
  46.                 if(left<0){  
  47.                     left=0;  
  48.                 }  
  49.                 if(left>back.getWidth()-slide.getWidth()){  
  50.                     left=back.getWidth()-slide.getWidth();  
  51.                 }  
  52.                 canvas.drawBitmap(slide, left, 0null);//滑块儿  
  53.             }else{  
  54.                 //根据开关的状态绘制滑块  
  55.                 if(state){  
  56.                     //getWidth()---背景的宽度  
  57.                     left=back.getWidth()-slide.getWidth();  
  58.                 }else{  
  59.                     left=0;  
  60.                 }  
  61.                 canvas.drawBitmap(slide, left, 0null); //滑块儿  
  62.             }  
  63.   
  64.     }  
  65.   
  66.     @Override  
  67.     public boolean onTouchEvent(MotionEvent event) {  
  68.          super.onTouchEvent(event);  
  69.         switch (event.getAction()){  
  70.             case MotionEvent.ACTION_DOWN:  
  71.                 currentX = (int) event.getX();  
  72.                 isTouch=true;  
  73.                 break;  
  74.             case MotionEvent.ACTION_MOVE:  
  75.                 currentX = (int) event.getX();  
  76.                 isTouch=true;  
  77.                 break;  
  78.             case MotionEvent.ACTION_UP:  
  79.                 isTouch=false;  
  80.                 currentX = (int) event.getX();  
  81.                 //当手指抬起的时候,应该判断一下滑块儿的位置,然后设置开关的状态  
  82.                 //currentX 在中间位置的那边  
  83.                 int centerX = back.getWidth()/2;//获取图片的宽度  
  84.                 //如果抬起时的位置大于图片宽度的一半  
  85.                 if(currentX>centerX){  
  86.                     state = true;  
  87.                 }else{  
  88.                     state=false;  
  89.                 }  
  90.                 //调用接口里的方法  
  91.                 onStateChangeListener.onStateChange(state);  
  92.                break;  
  93.         }  
  94.         //重新绘制  
  95.         invalidate();  
  96.         return true;  
  97.     }  
  98.   
  99.     //将控件的尺寸重新设置一下  
  100.   
  101.     @Override  
  102.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  103.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  104.         //根据背景图设置控件的宽高  
  105.         setMeasuredDimension(back.getWidth(),back.getHeight());//将需要的宽高设置进去  
  106.     }  
  107.   
  108.   
  109.     //接口回调  
  110.     public interface OnStateChangeListener{  
  111.         void onStateChange(boolean state);  
  112.     }  
  113.     //提供一个外部访问的方法  
  114.     public void setOnStateChange(OnStateChangeListener onStateChangeListener){  
  115.         this.onStateChangeListener = onStateChangeListener;  
  116.     }  
  117.   
  118.     //给外部提供一个设置开关的方法  
  119.     public void setState(boolean state) {  
  120.         this.state = state;  
  121.     }  
  122.     public boolean getState(){  
  123.         return state;  
  124.     };  
  125. }  
2.MainActivity

[java] view plain copy
  1. "font-size:18px;">public class MainActivity extends AppCompatActivity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.         SwitchButton sb=findViewById(R.id.sb);  
  8.         //在外部设置监听  
  9.         sb.setOnStateChange(new SwitchButton.OnStateChangeListener() {  
  10.             @Override  
  11.             public void onStateChange(boolean state) {  
  12.                 Toast.makeText(MainActivity.this,"当前状态---"+state, Toast.LENGTH_SHORT).show();  
  13.             }  
  14.         });  
  15.     }  
  16. }  
3.布局文件
[java] view plain copy
  1. "font-size:18px;">"1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android"  
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"  
  4.     xmlns:tools="http://schemas.android.com/tools"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     tools:context="com.bwie.day04_switchbutton.MainActivity">  
  8.   
  9.    
  10.        android:id="@+id/sb"  
  11.        android:layout_width="wrap_content"  
  12.        android:layout_height="wrap_content" />  
  13.   
  14.   

你可能感兴趣的:(android 自定义SwitchButton 开关状态)