自定义SlideSwitch(开关控件)

来源:互联网 发布:flash cc mac 编辑:程序博客网 时间:2024/05/23 20:01

实现效果:


定义样式:

    <declare-styleable name="slideswitch">        <attr name="themeColor" format="color" />        <attr name="isOpen" format="boolean" />        <attr name="shape">            <enum name="rect" value="1" />            <enum name="circle" value="2" />        </attr>    </declare-styleable>

使用方式:  在布局文件中  默认是关闭

 <com.example.tuhuadmin.truekeystore.views.SlideSwitch                    android:id="@+id/setting_wiff"                    android:layout_width="50dp"                    android:layout_height="30dp"                    android:layout_alignParentRight="true"                    android:layout_centerVertical="true"                    android:layout_marginRight="10dp"                    slideswitch:isOpen="false"                    slideswitch:shape="rect"                    slideswitch:themeColor="#e83d40" />

在activity中的使用

 mSettingWiff = (SlideSwitch) findViewById(R.id.setting_wiff);//进入页面时,首先获取wifi的状态 String wifionoff = SPUtils.getString(SettingsActivity.this, "wifionoff", "0", "wifi"); if (wifionoff.equals("0")) {     mSettingWiff.setState(true); } else if (wifionoff.equals("1")) {     mSettingWiff.setState(false); } //---------------------------------------------------- //设置拖拽监听 mSettingWiff.setSlideListener(new SlideSwitch.SlideListener() {     @Override     public void open() {         //打开状态  使用首选项进行存储         SPUtils.setString(SettingsActivity.this, "wifionoff", "0", "wifi");     }     @Override     public void close() {         //关闭状态         SPUtils.setString(SettingsActivity.this, "wifionoff", "0", "wifi");     } });


自定义控件

package com.example.tuhuadmin.truekeystore.views;import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.ValueAnimator;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.os.Bundle;import android.os.Looper;import android.os.Parcelable;import android.support.v4.view.MotionEventCompat;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.AccelerateDecelerateInterpolator;import com.example.tuhuadmin.truekeystore.R;/** * Created by on 2016/7/5. * PackageName:com.example.tuhuadmin.truekeystore.views * Author:crs */public class SlideSwitch extends View {    public static final int SHAPE_RECT = 1;    public static final int SHAPE_CIRCLE = 2;    private static final int RIM_SIZE = 6;    private static final int DEFAULT_ROUND_RADIO = 20;    private static final int DEFAULT_ROUND_COLOR = Color.parseColor("#eeeeee");    private static final int DEFAULT_COLOR_THEME = Color.parseColor("#e83d40");    // 3 attributes    private int color_theme;    private boolean isOpen;    private int shape;    // varials of drawing    private Paint paint;    //    private Paint paintb;    private RectF backRect;    private RectF frontRect;    private RectF frontCircleRect;    private RectF backCircleRect;    private int alpha;    private int max_left;    private int min_left;    private float frontRect_left;    private float frontRect_left_begin = RIM_SIZE;    private int eventStartX;    private int eventLastX;    private int diffX = 0;    private boolean slideable = true;    private SlideListener listener;    public interface SlideListener {        public void open();        public void close();    }    public SlideSwitch(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        listener = null;        paint = new Paint();        paint.setAntiAlias(true);        paint.setStyle(Paint.Style.FILL);        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.slideswitch);        color_theme = a.getColor(R.styleable.slideswitch_themeColor, DEFAULT_COLOR_THEME);        isOpen = a.getBoolean(R.styleable.slideswitch_isOpen, false);        shape = a.getInt(R.styleable.slideswitch_shape, SHAPE_RECT);        a.recycle();    }    public SlideSwitch(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public SlideSwitch(Context context) {        this(context, null);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        int width = measureDimension(280, widthMeasureSpec);        int height = measureDimension(140, heightMeasureSpec);        if (shape == SHAPE_CIRCLE) {            if (width < height)                width = height * 2;        }        setMeasuredDimension(width, height);        initDrawingVal();    }    public void initDrawingVal() {        int width = getMeasuredWidth();        int height = getMeasuredHeight();        backCircleRect = new RectF();        frontCircleRect = new RectF();        frontRect = new RectF();        backRect = new RectF(0, 0, width, height);        min_left = RIM_SIZE;        if (shape == SHAPE_RECT)            max_left = width / 2;        else            max_left = width - (height - 2 * RIM_SIZE) - RIM_SIZE;        if (isOpen) {            frontRect_left = max_left;            alpha = 255;        } else {            frontRect_left = RIM_SIZE;            alpha = 0;        }        frontRect_left_begin = frontRect_left;    }    public int measureDimension(int defaultSize, int measureSpec) {        int result;        int specMode = MeasureSpec.getMode(measureSpec);        int specSize = MeasureSpec.getSize(measureSpec);        if (specMode == MeasureSpec.EXACTLY) {            result = specSize;        } else {            result = defaultSize; // UNSPECIFIED            if (specMode == MeasureSpec.AT_MOST) {                result = Math.min(result, specSize);            }        }        return result;    }    @Override    protected void onDraw(Canvas canvas) {        if (shape == SHAPE_RECT) {            paint.setColor(DEFAULT_ROUND_COLOR);            canvas.drawRoundRect(backRect, DEFAULT_ROUND_RADIO, DEFAULT_ROUND_RADIO, paint);            paint.setColor(alpha <= 20 ? DEFAULT_ROUND_COLOR : color_theme);            paint.setAlpha(alpha);            canvas.drawRoundRect(backRect, DEFAULT_ROUND_RADIO, DEFAULT_ROUND_RADIO, paint);            frontRect.set(frontRect_left, RIM_SIZE, frontRect_left                    + getMeasuredWidth() / 2 - RIM_SIZE, getMeasuredHeight()                    - RIM_SIZE);            paint.setColor(Color.WHITE);            canvas.drawRoundRect(frontRect, DEFAULT_ROUND_RADIO, DEFAULT_ROUND_RADIO, paint);        } else {            // draw circle            float radius;            radius = backRect.height() / 2 - RIM_SIZE;            paint.setColor(DEFAULT_ROUND_COLOR);            backCircleRect.set(backRect);            canvas.drawRoundRect(backCircleRect, radius, radius, paint);            paint.setColor(alpha <= 20 ? DEFAULT_ROUND_COLOR : color_theme);            paint.setAlpha(alpha);            canvas.drawRoundRect(backCircleRect, radius, radius, paint);            frontRect.set(frontRect_left, RIM_SIZE, frontRect_left                    + backRect.height() - 2 * RIM_SIZE, backRect.height()                    - RIM_SIZE);            frontCircleRect.set(frontRect);            paint.setColor(Color.WHITE);            canvas.drawRoundRect(frontCircleRect, radius, radius, paint);        }    }    @Override    public boolean onTouchEvent(MotionEvent event) {        if (slideable == false)            return super.onTouchEvent(event);        int action = MotionEventCompat.getActionMasked(event);        switch (action) {            case MotionEvent.ACTION_DOWN:                eventStartX = (int) event.getRawX();                break;            case MotionEvent.ACTION_MOVE:                eventLastX = (int) event.getRawX();                diffX = eventLastX - eventStartX;                float tempX = diffX + frontRect_left_begin;                tempX = (tempX > max_left ? max_left : tempX);                tempX = (tempX < min_left ? min_left : tempX);                if (tempX >= min_left && tempX <= max_left) {                    frontRect_left = tempX;                    alpha = (int) (255 * (float) tempX / (float) max_left);                    invalidateView();                }                break;            case MotionEvent.ACTION_UP:                int wholeX = (int) (event.getRawX() - eventStartX);                frontRect_left_begin = frontRect_left;                boolean toRight;                toRight = (frontRect_left_begin > max_left / 2 ? true : false);                if (Math.abs(wholeX) < 3) {                    toRight = !toRight;                }                moveToDest(toRight);                break;            default:                break;        }        return true;    }    /**     * draw again     */    private void invalidateView() {        if (Looper.getMainLooper() == Looper.myLooper()) {            invalidate();        } else {            postInvalidate();        }    }    public void setSlideListener(SlideListener listener) {        this.listener = listener;    }    public void moveToDest(final boolean toRight) {        ValueAnimator toDestAnim = ValueAnimator.ofFloat(frontRect_left,                toRight ? max_left : min_left);        toDestAnim.setDuration(500);        toDestAnim.setInterpolator(new AccelerateDecelerateInterpolator());        toDestAnim.start();        toDestAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                frontRect_left = (Float) animation.getAnimatedValue();                alpha = (int) (255 * (float) frontRect_left / (float) max_left);                invalidateView();            }        });        toDestAnim.addListener(new AnimatorListenerAdapter() {            @Override            public void onAnimationEnd(Animator animation) {                if (toRight) {                    isOpen = true;                    if (listener != null)                        listener.open();                    frontRect_left_begin = max_left;                } else {                    isOpen = false;                    if (listener != null)                        listener.close();                    frontRect_left_begin = min_left;                }            }        });    }    public void setState(boolean isOpen) {        this.isOpen = isOpen;        initDrawingVal();        invalidateView();        if (listener != null)            if (isOpen == true) {                listener.open();            } else {                listener.close();            }    }    public void setShapeType(int shapeType) {        this.shape = shapeType;    }    public void setSlideable(boolean slideable) {        this.slideable = slideable;    }    @Override    protected void onRestoreInstanceState(Parcelable state) {        if (state instanceof Bundle) {            Bundle bundle = (Bundle) state;            this.isOpen = bundle.getBoolean("isOpen");            state = bundle.getParcelable("instanceState");        }        super.onRestoreInstanceState(state);    }    @Override    protected Parcelable onSaveInstanceState() {        Bundle bundle = new Bundle();        bundle.putParcelable("instanceState", super.onSaveInstanceState());        bundle.putBoolean("isOpen", this.isOpen);        return bundle;    }}





0 0
原创粉丝点击