自定义SlideSwitch 适用于带网络延时状态的Switch

SlideSwitch

代码很简单废话就不多说了 直接上代码。

package com.osrv.ecc.easycontrolcar.Util.View;


import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.LinearInterpolator;

import com.osrv.ecc.easycontrolcar.R;

/**
 * Created by yj on 2018/4/13.
 */

public class SlideSwitch extends View {
    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); //抗锯齿
    private Paint aPaint=new Paint(Paint.ANTI_ALIAS_FLAG);

    boolean isOn = false;
    float curX = 0;
    float centerY; //y固定
    float viewWidth;
    float radius;
    float lineStart; //直线段开始的位置(横坐标,即
    float lineEnd; //直线段结束的位置(纵坐标
    float lineWidth;
    final int SCALE = 4; // 控件长度为滑动的圆的半径的倍数
    public boolean isShowAnim=false;
    private int bigPoint=0;
    OnStateChangedListener onStateChangedListener;
    private ValueAnimator animator;

    public SlideSwitch(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public SlideSwitch(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SlideSwitch(Context context) {
        super(context);
    }

    public void setOpenProgress(boolean openProgress) {
        isShowAnim = openProgress;
        if (openProgress) {
            if (animator==null) {
                //启动动画 一直重新绘制
                animator = ValueAnimator.ofInt(0,3);
                animator.setDuration(800);
                animator.setInterpolator(new LinearInterpolator());
                animator.setRepeatCount(ValueAnimator.INFINITE);
                animator.setRepeatMode(ValueAnimator.RESTART);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        bigPoint = ((int) animation.getAnimatedValue());
                        postInvalidate();
                    }
                });

            }
            animator.start();
        }else {
            if (animator!=null&&animator.isRunning()) {
                animator.end();
            }
        }
        //这边重新绘制方法
    }



    public void setCheck(boolean ischeck){
        if (ischeck){
            curX=lineEnd;
            isOn = true;
        }else {
            curX=lineStart;
            isOn = false;
        }
        postInvalidate();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        //这边必须要加载这个方法拦截父容器的事件
        getParent().requestDisallowInterceptTouchEvent(true);
        if (!isShowAnim) {
            curX = event.getX();
            if(event.getAction() == MotionEvent.ACTION_UP)
            {
                if(curX > viewWidth / 2)
                {
                    curX = lineEnd;
                    if(false == isOn)
                    {
                        //只有状态发生改变才调用回调函数, 下同
                        if(null != onStateChangedListener)
                        {
                            onStateChangedListener.onStateChanged(true);
                        }

                        isOn = true;
                    }

                }
                else
                {
                    curX = lineStart;
                    if(true == isOn)
                    {
                        if(null != onStateChangedListener)
                        {
                            onStateChangedListener.onStateChanged(false);
                        }
                        isOn = false;
                    }

                }

            }
            if (curX<lineStart){
                curX=lineStart;
            }
            if (curX>lineEnd){
                curX=lineEnd;
            }
            this.postInvalidate();
        }
        return true;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        /*保持宽是高的SCALE / 2倍, 即圆的直径*/
        this.setMeasuredDimension(this.getMeasuredWidth(), this.getMeasuredWidth() * 2 / SCALE);
        viewWidth = this.getMeasuredWidth();
        radius = viewWidth / SCALE;
        lineWidth = radius * 2f; //直线宽度等于滑块直径
        curX = radius;
        centerY = this.getMeasuredWidth() / SCALE; //centerY为高度的一半
        lineStart = radius;
        lineEnd = (SCALE - 1) * radius;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);

        /*限制滑动范围*/
        curX = curX > lineEnd?lineEnd:curX;
        curX = curX < lineStart?lineStart:curX;



        //下面就是动画开启
        if (isShowAnim){
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(lineWidth);

            mPaint.setColor(getResources().getColor(R.color.color999999));
            canvas.drawLine(lineStart, centerY, lineEnd, centerY, mPaint);
            mPaint.setStyle(Paint.Style.FILL);
            canvas.drawCircle(lineEnd, centerY, radius, mPaint);
            canvas.drawCircle(lineStart, centerY, radius, mPaint);
            drawAmin(canvas);

        }else {
            /*划线*/
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(lineWidth);
        /*左边部分的线,绿色*/
            mPaint.setColor(getResources().getColor(R.color.colorPrimary));
            canvas.drawLine(lineStart, centerY, curX, centerY, mPaint);
        /*右边部分的线,灰色*/
            mPaint.setColor(getResources().getColor(R.color.color999999));
            canvas.drawLine(curX, centerY, lineEnd, centerY, mPaint);
        /*画圆*/
        /*画最左和最右的圆,直径为直线段宽度, 即在直线段两边分别再加上一个半圆*/
            mPaint.setStyle(Paint.Style.FILL);
            mPaint.setColor(getResources().getColor(R.color.color999999));
            canvas.drawCircle(lineEnd, centerY, lineWidth / 2, mPaint);
            mPaint.setColor(getResources().getColor(R.color.colorPrimary));
            canvas.drawCircle(lineStart, centerY, lineWidth / 2, mPaint);
        /*圆形滑块*/
            mPaint.setColor(getResources().getColor(R.color.AmostBGColor));
            canvas.drawCircle(curX, centerY, radius, mPaint);
        }



    }

    private void drawAmin(Canvas canvas) {
        float v = lineEnd - lineStart;
        switch (bigPoint){
            case 0:{
                mPaint.setColor(getResources().getColor(R.color.WhiteBg));
                canvas.drawRect(  new RectF(lineStart+v/2-lineWidth/10,lineWidth*2/5,lineStart+v/2+lineWidth/10,lineWidth*3/5),mPaint);
                mPaint.setColor(getResources().getColor(R.color.colord2d2d2));
                canvas.drawRect( new RectF(lineStart+v/2-lineWidth/2,lineWidth*2/5,lineStart+v/2-lineWidth*3/10,lineWidth*3/5),mPaint);
                mPaint.setColor(getResources().getColor(R.color.colorb5b5b5));
                canvas.drawRect(  new RectF(lineStart+v/2+lineWidth*3/10,lineWidth*2/5,lineStart+v/2+lineWidth/2,lineWidth*3/5),mPaint);

            }
            break;
            case 1:{
                mPaint.setColor(getResources().getColor(R.color.colorb5b5b5));
                canvas.drawRect(  new RectF(lineStart+v/2-lineWidth/10,lineWidth*2/5,lineStart+v/2+lineWidth/10,lineWidth*3/5),mPaint);
                mPaint.setColor(getResources().getColor(R.color.WhiteBg));
                canvas.drawRect( new RectF(lineStart+v/2-lineWidth/2,lineWidth*2/5,lineStart+v/2-lineWidth*3/10,lineWidth*3/5),mPaint);
                mPaint.setColor(getResources().getColor(R.color.colord2d2d2));
                canvas.drawRect(  new RectF(lineStart+v/2+lineWidth*3/10,lineWidth*2/5,lineStart+v/2+lineWidth/2,lineWidth*3/5),mPaint);

            }
            break;
            case 2:{
                mPaint.setColor(getResources().getColor(R.color.colord2d2d2));
                canvas.drawRect(  new RectF(lineStart+v/2-lineWidth/10,lineWidth*2/5,lineStart+v/2+lineWidth/10,lineWidth*3/5),mPaint);
                mPaint.setColor(getResources().getColor(R.color.colorb5b5b5));
                canvas.drawRect( new RectF(lineStart+v/2-lineWidth/2,lineWidth*2/5,lineStart+v/2-lineWidth*3/10,lineWidth*3/5),mPaint);
                mPaint.setColor(getResources().getColor(R.color.WhiteBg));
                canvas.drawRect(  new RectF(lineStart+v/2+lineWidth*3/10,lineWidth*2/5,lineStart+v/2+lineWidth/2,lineWidth*3/5),mPaint);

            }
            break;
        }
        bigPoint++;

    }

    /*设置开关状态改变监听器*/
    public void setOnStateChangedListener(OnStateChangedListener o)
    {
        this.onStateChangedListener = o;
    }

    /*内部接口,开关状态改变监听器*/
    public interface OnStateChangedListener
    {
        public void onStateChanged(boolean state);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值