package com.example.drawkongjian; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.Toast; /** * Created by John on 2018/5/12 0012. */ public class MyWanChen extends View implements View.OnClickListener { private Paint paint; private Bitmap sbackground; private Bitmap sbutton; private int bgwidth; private int bgheight; //定义变量 private boolean isOpen = false; private boolean isMove = false; private int xzhou = 0;//定义x轴位置 private int firstX;//用户滑动的开始位置 private int lastX;//用户滑动的结束位置 private int xzhouMax; //2.声明接口对象 private IcallBack icallBack; //3.获取接口对象中的方法 public void setIcallBack(IcallBack icallBack){ this.icallBack = icallBack; } //1.定义接口 public interface IcallBack{ //只有申明,没有实现 void onClickOpen(boolean isOpnes); } public MyWanChen(Context context) { this(context,null); } public MyWanChen(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public MyWanChen(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { //得到两张图片 sbackground = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background); sbutton = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button); //创建画笔 paint = new Paint(); //获取背景图的一半 xzhouMax = sbackground.getWidth()-sbutton.getWidth(); setOnClickListener(this); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { bgwidth = sbackground.getWidth(); bgheight = sbackground.getHeight(); setMeasuredDimension(bgwidth,bgheight); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(sbackground,0,0,paint); canvas.drawBitmap(sbutton,xzhou,0,paint); } @Override public void onClick(View view) { if(!isMove){ if(isOpen){ xzhou = 0; }else { xzhou = xzhouMax; } isOpen = !isOpen;//去反值 icallBack.onClickOpen(isOpen);//给接口中的方法赋值 } invalidate(); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: //获取移动开始的位置 lastX = firstX = (int) event.getX(); isMove = false; //不是移动 break; case MotionEvent.ACTION_MOVE: //获取用的新坐标 int newX = (int) event.getX(); //移动的长度为 新坐标-获取移动开始的位置 int yidong = newX-lastX; int abs = Math.abs(yidong);//跟移动的位置判断他是移动还是点击 if(abs > 4){ isMove = true; Toast.makeText(getContext(), "你好我是移动", Toast.LENGTH_SHORT).show(); } xzhou = xzhou+yidong; lastX = newX;//最新的x轴坐标就成了新的终点 //调用方法 setKuan(); break; case MotionEvent.ACTION_UP: //获得抬起时的坐标 int upX = (int) event.getX(); if(upX - firstX > xzhouMax/2){ isOpen = true; }else if(firstX - upX >xzhouMax/2){ isOpen = false; } gaiBiaoZhuangTai(); break; } return true; } private void gaiBiaoZhuangTai() { if(isOpen){ xzhou = xzhouMax; }else { xzhou = 0; } } private void setKuan() { if(xzhou<0){ xzhou = 0; }else if(xzhou>xzhouMax){ xzhou = xzhouMax; } invalidate(); } }
-----------------布局页面----------------------
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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.example.drawkongjian.MainActivity"> <com.example.drawkongjian.MyWanChen android:id="@+id/mywc" android:layout_below="@+id/jkjk" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> ----------------------主类----------------
package com.example.drawkongjian; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*MyView myView = new MyView(this); MyOpen open = new MyOpen(this);*/ MyWanChen myWanChen = findViewById(R.id.mywc); myWanChen.setIcallBack(new MyWanChen.IcallBack() {//接口的回调 @Override public void onClickOpen(boolean isOpnes) { Toast.makeText(MainActivity.this, ""+isOpnes, Toast.LENGTH_SHORT).show(); } }); } }