JellyToggleButton(JTB)是一款拥有18种果冻动态效果和30种缓动类型的开关按钮。你也可以自己定制属于自己的JTB。也许上面的gif不太清晰,点击下面的视频可以看到JTB的动态效果。
- 部分代码启发自 SwitchButton
dependencies {
...
compile 'com.nightonke:jellytogglebutton:1.0.2'
...
}
Demo里可以看到目前JTB支持的所有效果,可以从这下载Demo:
- 18 Jellys
- Define Your Jelly
- Ease Types
- SetCheck Methods
- Colors
- ColorChangeType
- Fonts
- Duration
- Text, Text Size and Margins
- Draggable
- Listener
- Other Methods
JTB提供18种果冻动态效果,可以在xml中轻松使用或者在代码中通过setJelly()
方法来设置。
xml中:
<com.nightonke.jellytogglebutton.JellyToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:jtbJelly="itself"
/>
JAVA代码中:
jtb.setJelly(Jelly.ITSELF);
注意最后一种随机类型会随机在其他17种类型之间随机切换。
JTB提供自定义果冻效果的方法。但是理解具体的实现原理需要花点时间来阅读Jelly enum源码。所有的果冻效果都是来自于超类JellyStyle.class。继承这个超类的时候,你需要实现三个方法:
public class MyJelly extends JellyStyle {
@Override
public void changeShape(PointWithHorizontalPoints p1, PointWithVerticalPoints p2, PointWithHorizontalPoints p3, PointWithVerticalPoints p4, float stretchDistance, float bezierControlValue, float bezierScaleRatioValue, float thumbRadius, float process, State state) {
// 改变手柄的形状
// 注意我们用了12个点来控制4条贝塞尔曲线来绘制手柄
// 我们可以通过控制这12个点来控制手柄形状
}
@Override
public void changeOffset(PointWithHorizontalPoints p1, PointWithVerticalPoints p2, PointWithHorizontalPoints p3, PointWithVerticalPoints p4, float totalLength, float extractLength, float process, State state, EaseType easeType) {
// 改变手柄的位移
}
@Override
public float extractLength(float stretchDistance, float bezierControlValue, float bezierScaleRatioValue, float thumbRadius) {
// 返回在形变中额外增加的距离
}
}
继承了上述超类、实现了这三个方法之后,使用setCustomJelly()
来激活你的自定义果冻动效。注意,如果你不再想使用你的自定义效果,要使用removeCustomJelly()
方法来重置。
缓动类型可以用来产生手柄的不同位移效果。
当然还有线性效果。你可以在这里找到所有的缓动效果。
可以非常轻松地在xml中使用缓动类型:
<com.nightonke.jellytogglebutton.JellyToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:jtbEaseType="ease_in_out_circ"
/>
或者通过JAVA代码:
jtb.setEaseType(EaseType.EaseInOutCirc);
下表列出了所有的缓动效果:
app:jtbEaseType="" | setEaseType() |
---|---|
ease_in_sine | EaseType.EaseInSine |
ease_out_sine | EaseType.EaseOutSine |
ease_in_out_sine | EaseType.EaseInOutSine |
ease_in_quad | EaseType.EaseInQuad |
ease_out_quad | EaseType.EaseOutQuad |
ease_in_out_quad | EaseType.EaseInOutQuad |
ease_in_cubic | EaseType.EaseInCubic |
ease_out_cubic | EaseType.EaseOutCubic |
ease_in_out_cubic | EaseType.EaseInOutCubic |
ease_in_quart | EaseType.EaseInQuart |
ease_out_quart | EaseType.EaseOutQuart |
ease_in_out_quart | EaseType.EaseInOutQuart |
ease_in_quint | EaseType.EaseInQuint |
ease_out_quint | EaseType.EaseOutQuint |
ease_in_out_quint | EaseType.EaseInOutQuint |
ease_in_expo | EaseType.EaseInExpo |
ease_out_expo | EaseType.EaseOutExpo |
ease_in_out_expo | EaseType.EaseInOutExpo |
ease_in_circ | EaseType.EaseInCirc |
ease_out_circ | EaseType.EaseOutCirc |
ease_in_out_circ | EaseType.EaseInOutCirc |
ease_in_back | EaseType.EaseInBack |
ease_out_back | EaseType.EaseOutBack |
ease_in_out_back | EaseType.EaseInOutBack |
ease_in_elastic | EaseType.EaseInElastic |
ease_out_elastic | EaseType.EaseOutElastic |
ease_in_out_elastic | EaseType.EaseInOutElastic |
ease_in_bounce | EaseType.EaseInBounce |
ease_out_bounce | EaseType.EaseOutBounce |
ease_in_out_bounce | EaseType.EaseInOutBounce |
linear | EaseType.Linear |
JTB提供全面的方法来方便使用者改变JTB的状态(当手柄在右边,我们说此时开关按钮处于打开,也就是checked状态):
isChecked()
返回当前JTB是否处于打开状态。setChecked(boolean checked)
设置JTB当前的状态,并伴以动画。如果监听器被设置,那么它将会被调用。setChecked(boolean checked, boolean callListener)
同上,但是可以选择是否调用监听器(如果它不为空)。setCheckedImmediately(boolean checked)
设置JTB的状态,不伴随动画,会调用监听器。setCheckedImmediately(boolean checked, boolean callListener)
同上,但是可以选择是否调用监听器。toggle()
切换状态,有动画,会调用监听器。toggle(boolean callListener)
同上,可选择是否调用监听器。toggleImmediately()
切换状态,无动画,会调用监听器。toggleImmediately(boolean callListener)
同上,可选择是否调用监听器。
来填涂自己的JTB。
改变当手柄滑到最左的背景颜色:
setLeftBackgroundColor(int color)
setLeftBackgroundColor(String color)
- ```setLeftBackgroundColorRes(int res)``
改变当手柄滑到最右的背景颜色:
setRightBackgroundColor(int color)
setRightBackgroundColor(String color)
setRightBackgroundColorRes(int res)
改变背景颜色:
setBackgroundColor(int color)
setBackgroundColor(String color)
setBackgroundColorRes(int res)
改变当手柄滑到最左的颜色:
setLeftThumbColor(int color)
setLeftThumbColor(String color)
setLeftThumbColorRes(int res)
改变当手柄滑到最右的颜色:
setRightThumbColor(int color)
setRightThumbColor(String color)
setRightThumbColorRes(int res)
改变当手柄的颜色:
setThumbColor(int color)
setThumbColor(String color)
setThumbColorRes(int res)
改变左边字体颜色:
setLeftTextColor(int color)
setLeftTextColor(String color)
setLeftTextColorRes(int res)
改变右边字体颜色:
setRightTextColor(int color)
setRightTextColor(String color)
setRightTextColorRes(int res)
改变字体颜色:
setTextColor(int color)
setTextColor(String color)
setTextColorRes(int res)
或者在xml中:
<com.nightonke.jellytogglebutton.JellyToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:jtbLeftBackgroundColor="@android:color/black"
app:jtbRightBackgroundColor="@android:color/white"
app:jtbLeftThumbColor="@android:color/white"
app:jtbRightThumbColor="@android:color/black"
app:jtbLeftTextColor="@android:color/black"
app:jtbRightTextColor="@android:color/white"
/>
使用setColorChangeType(ColorChangeType colorChangeType)
来在两种颜色变化方式(ColorChangeType.RGB or ColorChangeType.HSV)切换,又或者通过xml:
<com.nightonke.jellytogglebutton.JellyToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:jtbColorChangeType="hsv"
/>
更多有关颜色变化方式信息可在这里找到。
用setLeftTextTypeface(Typeface typeface)
和setLeftTextTypeface(String typefaceString)
来设置左文字字体,注意typefaceString
是字体文件在assets文件夹下的路径。类似地,用 setRightTextTypeface(Typeface typeface)
和setRightTextTypeface(String typefaceString)
来设置右文字字体。
在xml中:
<com.nightonke.jellytogglebutton.JellyToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:jtbLeftTextTypeface="fonts/Lato-Hairline.ttf"
app:jtbRightTextTypeface="fonts/Lato-Hairline.ttf"
/>
用setDuration(int duration)
来设置动画延时(毫秒),默认值是1000毫秒。
在xml中:
<com.nightonke.jellytogglebutton.JellyToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:jtbDuration="1000"
/>
- 用
setLeftText(String text)
,setLeftTextRes(int res)
,setRightText(String text)
,setRightTextRes(int res)
,setText(String leftText, String rightText)
和setTextRes(int leftRes, int rightRes)
来设置文字。 - 用
setTextSize(int textSize)
和setTextSizeRes(int res)
来设置字体大小。 - 用
setTextMarginLeft(float margin)
和setTextMarginLeftRes(int res)
来设置左文字距离背景最左的距离。 - 用
setTextMarginRight(float margin)
和setTextMarginRightRes(int res)
来设置右文字距离背景最右的距离。 - 用
setTextMarginTop(float margin)
和setTextMarginTopRes(int res)
来设置文字距离背景顶部的距离。 - 用
setTextMarginBottom(float margin)
和setTextMarginBottomRes(int res)
来设置文字距离背景底部的距离。 - 用
setTextMarginCenter(float margin)
和setTextMarginCenterRes(int res)
来设置左文字和右文字之间的距离。
在xml中:
<com.nightonke.jellytogglebutton.JellyToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:jtbLeftText="Male"
app:jtbRightText="Female"
app:jtbLeftTextSize="12sp"
app:jtbRightTextSize="12sp"
app:jtbTextMarginLeft="2dp"
app:jtbTextMarginRight="2dp"
app:jtbTextMarginBottom="2dp"
app:jtbTextMarginTop="2dp"
app:jtbTextMarginCenter="4dp"
/>
如果想禁止用户对JTB的拖动操作,使用setDraggable(boolean draggable)
来置为false。
在xml中:
<com.nightonke.jellytogglebutton.JellyToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:jtbDraggable="false"
/>
JTB使用OnStateChangeListener
来监听其自身的事件。
jtb.setOnStateChangeListener(new JellyToggleButton.OnStateChangeListener() {
@Override
public void onStateChange(float process, State state, JellyToggleButton jtb) {
// process - 当前动画进度,在[0, 1]之间
// state - JTB的当前状态,其值为State.LEFT,State.LEFT_TO_RIGHT,State.RIGHT和State.RIGHT_TO_LEFT其中之一
// jtb - JTB自身
}
});
举个例子,如果需要监听JTB的开关状态(开是指手柄达到最右):
@Override
public void onStateChange(float process, State state, JellyToggleButton jbt) {
if (state.equals(State.LEFT)) {
if (lastToast != null) lastToast.cancel();
lastToast = Toast.makeText(this, "Left!", Toast.LENGTH_SHORT);
lastToast.show();
}
if (state.equals(State.RIGHT)) {
if (lastToast != null) lastToast.cancel();
lastToast = Toast.makeText(this, "Right!", Toast.LENGTH_SHORT);
lastToast.show();
}
}
当手柄移动到相同的状态,比如,当用户只是稍微移动了一下手柄,然后就松开手,那么这个时候手柄会自己移动回它上次的终点状态(最左或最右),如果希望在移动到相同的终点状态时回调监听器,可以通过setMoveToSameStateCallListener(boolean callListener)
来设置。
或者在xml中:
<com.nightonke.jellytogglebutton.JellyToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:jtbMoveToSameStateCallListener="true"
/>
以下函数用处很小,如果想微调JTB可以使用:
setTouchMoveRatioValue(float ratio)
设置拖动和手柄实际移动距离的比值。setBezierControlValue(float value)
,setBezierControlValueRes(int res)
设置贝塞尔控制参数。setStretchDistanceRatioValue(float value)
设置手柄半径和拉伸距离的比值。setBezierScaleRatioValue(float value)
,setBezierScaleRatioValueRes(int res)
设置贝塞尔控制拉伸参数。
Test Version.
First Version.
Todo正在被todo……
Copyright 2016 Nightonke
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.