防iphone滑动开关按钮

效果图:

防iphone滑动开关按钮

 

public class SlipButton extends View implements OnTouchListener
{
    private boolean NowChoose = false;// 记录当前按钮是否打开,true为打开,flase为关闭

    private boolean isChecked;

    private boolean OnSlip = false;// 记录用户是否在滑动的变量

    private float DownX, NowX;// 按下时的x,当前的x

    private Rect Btn_On, Btn_Off;// 打开和关闭状态下,游标的Rect .

    private boolean isChgLsnOn = false;

    private OnChangedListener ChgLsn;

    private Bitmap bg_on, bg_off, slip_btn;

    public SlipButton(Context context)
    {
        super(context);
        init();
    }

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

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

    private void init()
    {// 初始化

        bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.split_left_1);
        bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.split_right_1);
        slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.split_1);
        Btn_On = new Rect(0, 0, slip_btn.getWidth(), slip_btn.getHeight());
        Btn_Off = new Rect(bg_off.getWidth() - slip_btn.getWidth(), 0, bg_off.getWidth(),
                slip_btn.getHeight());
        setOnTouchListener(this);// 设置监听器,也可以直接复写OnTouchEvent
    }

    @Override
    protected void onDraw(Canvas canvas)
    {// 绘图函数

        super.onDraw(canvas);

        Matrix matrix = new Matrix();
        Paint paint = new Paint();
        float x;

        if (NowX < (bg_on.getWidth() / 2))// 滑动到前半段与后半段的背景不同,在此做判断
        {
            x = NowX - slip_btn.getWidth() / 2;
            canvas.drawBitmap(bg_off, matrix, paint);// 画出关闭时的背景
        }

        else
        {
            x = bg_on.getWidth() - slip_btn.getWidth() / 2;
            canvas.drawBitmap(bg_on, matrix, paint);// 画出打开时的背景
        }

        if (OnSlip)// 是否是在滑动状态,

        {
            if (NowX >= bg_on.getWidth())// 是否划出指定范围,不能让游标跑到外头,必须做这个判断

                x = bg_on.getWidth() - slip_btn.getWidth() / 2;// 减去游标1/2的长度...

            else if (NowX < 0)
            {
                x = 0;
            }
            else
            {
                x = NowX - slip_btn.getWidth() / 2;
            }
        }
        else
        {// 非滑动状态

            if (NowChoose)// 根据现在的开关状态设置画游标的位置
            {
                x = Btn_Off.left;
                canvas.drawBitmap(bg_on, matrix, paint);// 初始状态为true时应该画出打开状态图片
            }
            else
                x = Btn_On.left;
        }
        if (isChecked)
        {
            canvas.drawBitmap(bg_on, matrix, paint);
            x = Btn_Off.left;
            isChecked = !isChecked;
        }

        if (x < 0)// 对游标位置进行异常判断...
            x = 0;
        else if (x > bg_on.getWidth() - slip_btn.getWidth())
            x = bg_on.getWidth() - slip_btn.getWidth();
        canvas.drawBitmap(slip_btn, x, 0, paint);// 画出游标.

    }

    public boolean onTouch(View v, MotionEvent event)
    {
        switch (event.getAction())
        // 根据动作来执行代码

        {
            case MotionEvent.ACTION_MOVE:// 滑动
                NowX = event.getX();
                break;

            case MotionEvent.ACTION_DOWN:// 按下

                if (event.getX() > bg_on.getWidth() || event.getY() > bg_on.getHeight())
                    return false;
                OnSlip = true;
                DownX = event.getX();
                NowX = DownX;
                break;

            case MotionEvent.ACTION_CANCEL: // 移到控件外部

                OnSlip = false;
                boolean choose = NowChoose;
                if (NowX >= (bg_on.getWidth() / 2))
                {
                    NowX = bg_on.getWidth() - slip_btn.getWidth() / 2;
                    NowChoose = true;
                }
                else
                {
                    NowX = NowX - slip_btn.getWidth() / 2;
                    NowChoose = false;
                }
                if (isChgLsnOn && (choose != NowChoose)) // 如果设置了监听器,就调用其方法..
                    ChgLsn.OnChanged(NowChoose);
                break;
       

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oMartin1/article/details/46787295
个人分类: Android
上一篇Android手势(二)
下一篇有标题的圆角listView
想对作者说点什么? 我来说一句

android开发仿iphone开关按钮

2015年12月17日 2.04MB 下载

css3 iphone ios 开关按钮

2015年05月14日 2KB 下载

Android滑动开关按钮

2015年08月25日 10KB 下载

滑动开关按钮 ios开关按钮

2015年09月08日 346KB 下载

仿Iphone实现滑动选择器

2015年05月22日 3.9MB 下载

没有更多推荐了,返回首页

关闭
关闭