自定义开关设计原理:
自定义一个类继承View,重写构造方法,(主要重写两个参数的构造方法,这个方法会在初始化布局的时候调用)
在布局中调用该类。
为类中的各类小控件设计点击事件。
、、、、、、、、、、、、、、、、、、、、、、、
先上类openView:
package com.example.open_off; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * Created by yang on 2017/7/4. */ public class OpenView extends View implements View.OnClickListener { private Bitmap backgroundbitmap; private Bitmap slidebitmap; private Paint paint; private int slideleft; private int maxleft; private boolean isopen=false; private boolean isclickable=true; public OpenView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public OpenView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } public OpenView(Context context) { super(context); init(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(backgroundbitmap.getWidth(),backgroundbitmap.getHeight()); } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(backgroundbitmap,0,0,paint); canvas.drawBitmap(slidebitmap,slideleft,0,paint); //super.onDraw(canvas); } private void init(Context context) { paint=new Paint(); paint.setColor(Color.GREEN); paint.setAntiAlias(true); backgroundbitmap= BitmapFactory.decodeResource(getResources(),R.drawable.switch_background); slidebitmap= BitmapFactory.decodeResource(getResources(),R.drawable.slide_button); maxleft=backgroundbitmap.getWidth()-slidebitmap.getWidth(); slideleft=0; setOnClickListener(this); } @Override public void onClick(View v) { if (isclickable){ if (isopen){ //变成关 slideleft=0; }else { //变成开 slideleft=maxleft; } isopen=!isopen; invalidate(); } } int startX=0; @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction()){ //按下 case MotionEvent.ACTION_DOWN: startX= (int) event.getRawX(); break; //移动 case MotionEvent.ACTION_MOVE: int endX= (int) event.getRawX(); int dx=endX-startX; if (dx<10){ isclickable=true; }else { isclickable=false; } slideleft+=dx; if (slideleft<0){ slideleft=0; } if (slideleft>maxleft){ slideleft=maxleft; } invalidate(); startX=endX; break; //离开 case MotionEvent.ACTION_UP: if (slideleft>maxleft/2){ slideleft=maxleft; }else { slideleft=0; } invalidate(); break; } return true; } }
再上我们的布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.open_off.MainActivity"> //调用该类 <com.example.open_off.OpenView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout>
最后上效果图:
操作效果:
点击切换,滑动切换:
滑动冲突的解决方式:
int endX= (int) event.getRawX(); int dx=endX-startX; if (dx<10){ isclickable=true; }else { isclickable=false; }