仿IOS SwitchButton开关滑动效果,给你丝滑般的体验

  1. 背景
  2. 效果
  3. 使用方法
  4. 原理解析

背景

由于开发中经常会用到滑动开关,但是Android自带的滑动开发滑动效果太难看,所以这里模仿了IOS的滑动效果自制了一个滑动开关.

效果

在这里插入图片描述

使用方法

1.style.xml中引入自定义标签
 <declare-styleable name="SwitchButton">
 <attr name="sb_shadow_radius" format="reference|dimension" />
 <attr name="sb_shadow_offset" format="reference|dimension" />
 <attr name="sb_shadow_color" format="reference|color" />
 <attr name="sb_uncheck_color" format="reference|color" />
 <attr name="sb_checked_color" format="reference|color" />
 <attr name="sb_border_width" format="reference|dimension" />
 <attr name="sb_checkline_color" format="reference|color" />
 <attr name="sb_checkline_width" format="reference|dimension" />
 <attr name="sb_uncheckcircle_color" format="reference|color" />
 <attr name="sb_uncheckcircle_width" format="reference|dimension" />
 <attr name="sb_uncheckcircle_radius" format="reference|dimension" />
 <attr name="sb_checked" format="reference|boolean" />
 <attr name="sb_shadow_effect" format="reference|boolean" />
 <attr name="sb_effect_duration" format="reference|integer" />
 <attr name="sb_button_color" format="reference|color" />
 <attr name="sb_show_indicator" format="reference|boolean" />
 <attr name="sb_background" format="reference|color" />
 <attr name="sb_enable_effect" format="reference|boolean" />
 </declare-styleable>
2.引入自定义View布局
<per.stramchen.switchbuttondemo.SwitchButton
	android:id="@+id/btn_voice_switch"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_weight="1"
	app:sb_background="#E8E9EB"
	app:sb_checked_color="#65C065"
	app:sb_show_indicator="false" />
3.设置监听
        switchButton.setOnCheckedChangeListener(
        new SwitchButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(SwitchButton view, final boolean isChecked) {
           
            }
        });

4.原理解析

实现思路其实很简单,我们可以将按钮的状态变换分为两种情况.
1.手动拖拽改变按钮位置.
2.点击使按钮自动滑动到另一端.

1.手动拖拽改变按钮位置.

对于第一种情况的实现其实很容易,我们只需要用手指移动的距离来改变滑块的位置,以及背景色的深浅即可.当然这需要我们手动拦截View的touch事件.以下贴出关键代码.
fraction我们可以理解为变化率,就是手指划过的距离占整个控件的百分比,接下来我们利用fraction来计算出button的X坐标,下面的buttonMaxX-buttonMinX我们可以理解为SwitchButton的真实长度.然后我们利用argbEvaluator这样一个颜色估值器来拿到不同时刻的变化率的颜色值,将它赋给背景色.最后调用postInvalidate();来刷新UI,我们就可以达到用手滑的时候,颜色随之改变的效果了.

//……………………………………部分代码省略
case MotionEvent.ACTION_MOVE:{
//拖动按钮位置,同时改变对应的背景颜色
float fraction = eventX / getWidth();
//变化率
fraction = Math.max(0f, Math.min(1f, fraction));
//滑块的位置
viewState.buttonX = buttonMinX
                   + (buttonMaxX - buttonMinX)
                   * fraction;
//背景色
viewState.checkStateColor = (int) argbEvaluator.evaluate(
                            fraction,
                            uncheckColor,
                            checkedColor);
postInvalidate();
}
//……………………………………部分代码省略
2.点击使按钮自动滑动到另一端

这个实现起来其实也很方便,我们只需要利用一个属性动画,即可解决问题.
那么第一步我们需要判断它是否是一个点击时间,由于我们拦截了整个touch事件,那么点击事件的判断需要我们自己来完成,我们可以用一次按下抬起的时间小于300ms来判断它是否是一次点击事件

if(System.currentTimeMillis() - touchDownTime <= 300){
                    //点击时间小于300ms,认为是点击操作
                    toggle();
                }

如果是点击事件,我们就可以开启动画来让滑块自己滑动来.这里我们并没有使用ObjectAnimator,而是使用的是ValueAnimator,因为这样可以让我们在每一帧改变多个属性.下面展示关键代码.
实现方式,其实与上面也很类似,只不过这时候我们改变属性的时刻不是在touch的时候了,而且在ValueAnimator每一帧的回调里.同样是计算button的X坐标,背景色,以及变化半径.

@Override
//……………………………………部分代码省略
public void onAnimationUpdate(ValueAnimator animation) {
//……………………………………部分代码省略
viewState.buttonX = beforeState.buttonX
                  + (afterState.buttonX - beforeState.buttonX) * value;

float fraction = (viewState.buttonX - buttonMinX) / (buttonMaxX - buttonMinX);

viewState.checkStateColor = (int) argbEvaluator.evaluate(
                            fraction,
                            uncheckColor,
                            checkedColor
                    );

viewState.radius = fraction * viewRadius;
                    );
postInvalidate();
//……………………………………部分代码省略
}

当然,真实场景要比理论稍微复杂一些,我们需要考虑一些特殊的情况,比如在自动滑动的时候,我们突然点击了滑块,我们该怎么处理.等等.这里就不详细展开了.读者可以阅读源码自行探索.

下面贴出源码以及demo地址,
https://github.com/stramChen/SwitchButton

如果任何疑问,请联系邮箱:569133338@qq.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发中,可以使用Switch控件来实现类似iOS的美化效果。下面是一种实现方式: 1. 首先,在XML布局文件中添加Switch控件: ```xml <Switch android:id="@+id/switch_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:thumb="@drawable/switch_thumb" android:track="@drawable/switch_track" /> ``` 2. 创建两个drawable资源文件,用于设置Switch的样式。例如,switch_thumb.xml和switch_track.xml。 - switch_thumb.xml:用于设置Switch块样式。 ```xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/switch_thumb_on" android:state_checked="true" /> <item android:drawable="@drawable/switch_thumb_off" /> </selector> ``` - switch_track.xml:用于设置Switch的背景样式。 ```xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/switch_track_on" android:state_checked="true" /> <item android:drawable="@drawable/switch_track_off" /> </selector> ``` 3. 创建四个drawable资源文件,用于设置Switch的不同状态下的样式。例如,switch_thumb_on.xml、switch_thumb_off.xml、switch_track_on.xml和switch_track_off.xml。 4. 在Java代码中,可以通过findViewById方法获取Switch控件的实例,并对其进行操作。例如,监听Switch的状态变化: ```java Switch switchButton = findViewById(R.id.switch_button); switchButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // 处理Switch状态变化的逻辑 } }); ``` 以上是一种实现Android Switch仿iOS美化的方式。你还有其他相关问题吗?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值