package com.example111.sxy.a04; 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; /** * Created by sxy on 2017/10/21. * 一个视图从创建到显示过程中的主要方法 * 1 构造方法实例化类 * 2测量measure(int,int)-->onMeasure(); * 如果当前View是一个viewGroud,还有义务测量孩子 * 如果孩子有建议权 * 3指定控件的位置layout()-->onlayout(); * 指定控件的位置,一般View不用写这个方法,viewGroup的时候才需要 * 4绘制视图 draw()---onDrow(canvas) * 根据上面两个方法参数,进入绘制 */ public class MyToggleButton extends View implements View.OnClickListener{ private Bitmap backgroundBitmap; private Bitmap slidingBitmap; private int slidLeftMax; private int slidLeft = 0; private Paint paint; private boolean isopen = false; public MyToggleButton(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initView(); } private void initView(){ paint = new Paint(); paint.setAntiAlias(true); backgroundBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.switch_background); slidingBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.slide_button); slidLeftMax = backgroundBitmap.getWidth()-slidingBitmap.getWidth(); setOnClickListener(this); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight()); } @Override protected void onDraw(Canvas canvas) { // super.onDraw(canvas); canvas.drawBitmap(backgroundBitmap,0,0,paint); canvas.drawBitmap(slidingBitmap,slidLeft,0,paint); } private boolean isEnableClick = true; @Override public void onClick(View view) { if(isEnableClick) { isopen = !isopen; } if(isopen) { slidLeft = slidLeftMax; }else { slidLeft = 0; } invalidate(); } public void flash(){ if(isopen) { slidLeft = slidLeftMax; }else { slidLeft = 0; } invalidate(); } private float startx; private float Lastx; @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: Lastx = startx = event.getRawX(); isEnableClick = true; break; case MotionEvent.ACTION_MOVE: float endx = event.getRawX(); float distancex = endx-startx; slidLeft = (int) (slidLeft+distancex); if(slidLeft<0) { slidLeft = 0; }else if(slidLeft>slidLeftMax) { slidLeft = slidLeftMax; } invalidate(); startx = event.getRawX(); if(Math.abs(endx-Lastx) > 5) { isEnableClick = false; } break; case MotionEvent.ACTION_UP: if(!isEnableClick) { if(slidLeft>slidLeftMax/2) { isopen = true; }else { isopen = false; } flash(); } break; } return true; } }
<?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.example111.sxy.a04.MainActivity" android:paddingBottom="16dp" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="16dp"> <com.example111.sxy.a04.MyToggleButton android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_centerInParent="true"/> </RelativeLayout>