//自定义类继承View
- <span style="font-size:18px;">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;
- };
- }</span>
- <span style="font-size:18px;">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();
- }
- });
- }
- }</span>
- <span style="font-size:18px;"><?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></span>