android ——滑动开关

一 :效果图

开启时:

关闭时:

二:步骤:

1. 写一个类SlippingBtn继承View,并实现OnTouchListener接口。重写父类两个构造函数(一个参数的,二个参数的)

2. 初始化滑块的背景图片并记录滑动块处于开启和关闭时的位置,注册setOnTouchListener事件

开启时:

滑动块左边坐标:bg_on的宽度减去bg_slipping的宽度
   滑动块上面坐标:0
 
 滑动块右面坐标:bg_on的宽度
 
 滑动块下面坐标:bg_slipping的高度
关闭时:
   滑动块左边坐标:0
   滑动块上面坐标:0
 
 滑动块右面坐标:获取滑块的宽度
 
 滑动块下面坐标:bg_on的高度
3、初始化开关的状态 setToggleState(boolean status),并用一个成员变量currToggleState记住当前开关是否开启
4、设置监听器,监听滑动开关状态的变化,响应不同的事件
5、触摸时的逻辑:

case MotionEvent.ACTION_DOWN:

记住当前的位置;滑块处于滑行的状态;

break;

case MotionEvent.ACTION_MOVE:

更新滑块的位置;

break;

case MotionEvent.ACTION_UP:

滑块静止;

判断滑块的位置和bg_on的长度比较:记录开关状态

记录前一次的状态,判断是否这只监听器,及执行监听器的方法,

将前一次的状态记录为当前的状态;

break;

invalidate()刷新界面;

6、onMeasure():测量bg_on的长和宽

7、绘制开关开启和关闭以及滑块的背景

具体代码如下:

public class SlippingBtn extends View implements OnTouchListener{

    private Bitmap bg_on,bg_off,bg_slipping;
    private Rect bg_on_location,bg_off_location;
    private float slppCurLocation;//滑块当钱的位置
    private boolean isSlipping;//滑块是否在滑动
    private boolean currToggleState;//设置开关当前的状态
    private boolean isToggleStatusListener; //是否开启开关的状态监听
    private boolean proToggleState;//上一次开关的状态,默认为false;
    private OnToggleStatusListener listener;//开关监听器

    public HuaDong(Context context) {
        super(context);
        initView();
    }

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

    private void initView(){
        bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.on_btn);
        bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.off_btn);
        bg_slipping = BitmapFactory.decodeResource(getResources(), R.drawable.white_btn);

        //开关打开时滑块的坐标
        bg_on_location = new Rect(bg_on.getWidth()-bg_slipping.getWidth(),
                0, bg_on.getWidth(), bg_on.getHeight());
        //开关关闭时滑块的坐标
        bg_off_location = new Rect(0, 0, bg_slipping.getWidth(),
                bg_slipping.getHeight());
        setOnTouchListener(this);

    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            slppCurLocation = event.getX();
            isSlipping = true;
            break;
        case MotionEvent.ACTION_MOVE:
            slppCurLocation = event.getX();
            break;
        case MotionEvent.ACTION_UP:
            isSlipping = false;
            if(slppCurLocation < bg_on.getWidth()/2){
                currToggleState = false;
            }else{
                currToggleState = true;
            }

            if(isToggleStatusListener && currToggleState != proToggleState){
                proToggleState = currToggleState;//前一个状态这只为现在的状态;
                listener.onToggleStatus(currToggleState);
            }
            break;
        default:
            break;
        }
        invalidate();
        return true;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(bg_on.getWidth(),bg_on.getHeight() );
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Matrix matrix = new Matrix();
        Paint paint = new Paint();
        if(currToggleState){//开启开关
            canvas.drawBitmap(bg_on, matrix, paint);
        }else{//关闭开关
            canvas.drawBitmap(bg_off, matrix, paint);
        }
        //h绘制滑块
        float left_slipp = 0;//滑块的位置
        if(isSlipping){//滑动的状态下
            left_slipp = slppCurLocation - bg_slipping.getWidth()/2;
        }else{//滑块静止
            if(currToggleState){
                left_slipp = bg_on.getWidth() - bg_slipping.getWidth();
            }else{
                left_slipp = 0;
            }
        }

        if(left_slipp < 0){
            left_slipp = 0;
        }else if(left_slipp >(bg_on.getWidth()-bg_slipping.getWidth())){
            left_slipp = bg_on.getWidth() - bg_slipping.getWidth();
        }

        canvas.drawBitmap(bg_slipping, left_slipp,0, paint);
    }

    //设置d当前开关的状态
    public void setToggleState(boolean toggleStatus){
        currToggleState = toggleStatus;
    }

    public interface OnToggleStatusListener{
        /**
         * 开关状态变化时执行
         * @param toggeState 变化后的开关状态
         */
        void onToggleStatus(boolean toggeState);
    }
    //监听滑块的状态
    public void setOnToggleStatusListener(OnToggleStatusListener listener){
        this.listener = listener;
        isToggleStatusListener  = true;
    }

}

xml文件

    <com.view.util.SlippingBtn
        android:id="@+id/hd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

Activity调用:

    SlippingBtn toggle = (SlippingBtn) findViewById(R.id.hd);
        toggle.setToggleState(true);
        toggle.setOnToggleStatusListener(new OnToggleStatusListener() {

            @Override
            public void onToggleStatus(boolean toggeState) {
                if(toggeState){
                    Toast.makeText(getApplicationContext(), "开启开关", 1).show();
                }else{
                    Toast.makeText(getApplicationContext(), "关闭开关", 1).show();
                }

            }
        });

 

   

时间: 2024-11-03 21:56:06

android ——滑动开关的相关文章

Android滑动开关-ToggleButton

我们先看下滑动开关的效果图: 我们先上代码: 这里是自定义控件ToggleButton.java: package com.fay.toggle; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import an

Android SwitchButton(滑动开关)

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

Android 三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现

android三档自定义滑动开关,禁止点击功能的实现,普通开关网上有很多例子,三档滑动开关的则找了整天都没有相关例子,开始用普通开关的源码修改了自己实现了一个类,但效果不如人意,各种边界情况的算法很难考虑周全很难调试出满意的效果. 今 天尝试用系统组件seekbar实现自定义风格的滑动条,但禁止点击和判断滑动不到指定范围返回花了不少时间,网上基本上都说用继承seekbar修改里 面的方法实现,但整了半天也没有一个能够达到效果了,而且感觉太麻烦了,所以自己把默认的实现的几个接口返回的信息详细打印出

【转】Android SwitchButton(滑动开关)

原文网址:http://blog.csdn.net/wangjinyu501/article/details/27961303 版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: [html] view plaincopy @RemoteView public class Button extends TextView { public Button(Con

Android之实现滑动开关组件

由于Android并未提供滑动开关之类的组件,所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果. 这里有一个示例代码,它包括三个类:开关组件视图.状态监听接口.MainActivity 我们先来看看整个demo的效果图: 我们先来看看视图组件的完整代码,代码都已经注释: package com.bear.swtichbuttondemo; import java.util.ArrayList; import android.content.Context; import androi

Android自定义view 滑动开关 支持左右滑动 适用于listview

要做这样一种开关. 当开关在左边时,都是灰色的,向右滑动的时候,滑到一半的时候,改变颜色,变成绿色: 当开关在右边是,都市绿色的,向左滑动的时候,滑动一半的时候,改变颜色,变成灰色. 这里就要涉及要可滑动最大距离,以及你现在滑动的距离.通过这个来比较,改变颜色. import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.

Android自定义控件之滑动开关

自定义开关控件 Android自定义控件一般有三种方式 1.继承Android固有的控件,在Android原生控件的基础上,进行添加功能和逻辑. 2.继承ViewGroup,这类自定义控件是可以往自己的布局里面添加其他的子控件的. 3.继承View,这类自定义控件没有跟原生的控件有太多的相似的地方,也不需要在自己的肚子里添加其他的子控件. ToggleView自定义开关控件表征上没有跟Android原生的控件有什么相似的地方,而且在滑动的效果上也没有沿袭Android原生的地方,所以我们的自定义

android自定义View-------IOS风格的滑动开关

源码和测试例子已经放到github https://github.com/Leaking/SlideSwitch,欢迎star欢迎fork欢迎提issue 项目开发中,经常会有一些关于用户个性化的设置,此时经常需要一个开关控件,周末将之前写的自定义开关控件优化了一下,效果图如下.先说说大概思路:按钮绘制了三个图层,最下面是覆盖整个View的灰色,第二个是覆盖整个View的自定义的颜色,它可以改变透明度.第三个是白色.当白色部分移动时,修改第二个图层的透明度,即可作出如图滑动过程中颜色渐变的效果.

Android 拖动条(SeekBar)实例 附完整demo项目代码

1.拖动条的事件 实现SeekBar.OnSeekBarChangeListener接口.需要监听三个事件:数值改变(onProgressChanged)开始拖动(onStartTrackingTouch)停止拖动(onStopTrackingTouch) onStartTrackingTouch开始拖动时触发,与onProgressChanged区别是停止拖动前只触发一次而onProgressChanged只要在拖动,就会重复触发. 2.拖动条的主要属性和方法setMax 设置拖动条的数值se