Code Monkey home page Code Monkey logo

switchbutton's Introduction

SwitchButton

SwitchButton.An beautiful+lightweight+custom-style-easy switch widget for Android,minSdkVersion >= 14
issues welcome~

Features

-depend without third-part library
-without raw files(pictures/drawables etc...), only one java and style.xml file
-drag switch supported

UseAge

gradle:

repositories {
    mavenCentral()
    jcenter()
}

...

dependencies {
    implementation 'com.github.zcweng:switch-button:0.0.3@aar'
}

layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:orientation="vertical">

    <com.suke.widget.SwitchButton
        android:id="@+id/switch_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

Java:

SwitchButton switchButton = (com.suke.widget.SwitchButton)
    findViewById(R.id.switch_button);

switchButton.setChecked(true);
switchButton.isChecked();
switchButton.toggle();     //switch state
switchButton.toggle(false);//switch without animation
switchButton.setShadowEffect(true);//disable shadow effect
switchButton.setEnabled(false);//disable button
switchButton.setEnableEffect(false);//disable the switch animation
switchButton.setOnCheckedChangeListener(new SwitchButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(SwitchButton view, boolean isChecked) {
        //TODO do your job
    }
});

Kotlin:

val switchButton = findViewById<View>(R.id.switch_button) as SwitchButton

switchButton.isChecked = true
switchButton.isChecked
switchButton.toggle() //switch state
switchButton.toggle(false) //switch without animation
switchButton.setShadowEffect(true) //disable shadow effect
switchButton.isEnabled = false //disable button
switchButton.setEnableEffect(false) //disable the switch animation
switchButton.setOnCheckedChangeListener(object : SwitchButton.OnCheckedChangeListener {
    override fun onCheckedChanged(view: SwitchButton?, isChecked: Boolean) {
        //TODO do your job
    }
})

More Style:

<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"/>       动画时间,默认300ms
<attr name="sb_button_color" format="reference|color"/>            按钮颜色
<attr name="sb_show_indicator" format="reference|boolean"/>        是否显示指示器,默认true:显示
<attr name="sb_background" format="reference|color"/>              背景色,默认白色
<attr name="sb_enable_effect" format="reference|boolean"/>         是否启用特效,默认true

ScreenShot

Sample Apk:

License

MIT, See the [LICENSE] file for details.

switchbutton's People

Contributors

1349081910 avatar ivanabakumov avatar ktdynamic avatar mrfarhan321 avatar msdx avatar zcweng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

switchbutton's Issues

Double Size

How can I double size both with and height.(Too small for galaxt tab 10'5 inch)

无法改变开关状态而不进行回调

虽然setCheck(boolean)调用的是toggle(enableEffect, false),但是其动画执行结束的时候还是会回调事件。
我这里仅对于开头被用户打开或关闭需要发送请求,所以加了checked状态改变的监听,而查询到状态时只需要设置开关状态,并不需要发送请求。
通过关闭效果再打开可以解决这个问题,但是界面效果太僵硬。

How to disable drag?

Sometimes in some scenario we want to disable drag, and just want the swipeButton toggled just by click, can we achieve that?

无响应

为什么运行打开后点着没反应?sample中的写法

为什么要屏蔽掉onClickListener事件呢

有个问题,为什么您的控件里要屏蔽掉onClickListener这个方法呢。这样的话,您的控件在一些需要遥控器操作的项目上,不就没法使用了吗?

setChecked()会触发OnCheckedChangeListener监听器

@Override
    public void setChecked(boolean checked) {
        if(checked == isChecked()){
            postInvalidate();
            return;
        }
        toggle(enableEffect, false);
    }

当状态不相同时,会进入void toggle(boolean animate, boolean broadcast),虽然不进行监听播报,但是如果setEnableEffect(boolean enable)属于开启状态时,会启动开关的动画。但是在动画设置的动画动画监听器会在动画结束时播报改变事件,所以在动画结束时会进行一次void onCheckedChanged(SwitchButton view, boolean isChecked)事件播报。
所以当setEnableEffect(true)时,进行setChecked(!isChecked())必然会触发OnCheckedChangeListener监听器(并非立即触发,而是在动画结束以后触发的)。
如果调用toggle()会不会出现触发两次监听器(动画前一次,动画后一次)?(没有测试,未使用toggle()方法)
目前解决方案是在setChecked(boolean)之前先setEnableEffect(false),完成后再setEnableEffect(true)回去,期望作者早日修复,谢谢。

可以让它不自动根据点击改变状态么?

有的时候有这样的需求,现在在A界面点击一下SwitchButton跳转到B界面,这时候不想A改变开关状态,B中如果完成一些操作才更新A中的SwitchButton状态,如果没完成SwitchButton还是保持原来的状态

文档建议

建议在首页补充一下XML设置的东东
面得还要进来看sample中xml的内容

能不能添加preCheckedChanged生命周期或者CheckedChangeInterceptor

用了一下,感觉是个非常nice的组件,不过在做一个功能的时候遇到点小问题,能不能添加preCheckedChanged生命周期或者CheckedChangeInterceptor,以便在状态发生改变前进行一些操作,比如调用api或者检查网络状态,如果调用成功或者网络畅通就放行执行状态改变并触发onCheckedChanged事假,否则就回弹,并提示永用户无法操作,这样的话组件的灵活性会更好

SwitchButton的onCheckedChanged触发错误问题

如果有三个SwitchButton渲染,
前两个SwitchButton触发的是第三个SwitchButton的onCheckedChanged

依次:如果有多个SwitchButton渲染,不管点击哪个SwitchButton始终只是渲染最后一个
SwitchButton的onCheckedChanged,

求解,谢谢!

Add support for RTL layout

Your code shows that only when button thumb is visually on the left, it's unchecked. But in RTL layout, it should be resolved on the opposite side. This leads to poor compatibility for internationalization purposes. You may check isLayoutRtl() first just like Android's Switch.

您的代码显示,只有当按钮拇指在视觉上位于左侧时,它才处于未选中状态。但在RTL布局中,它应该解析在另一侧。这导致国际化方面的兼容性很差。您可以像 Android 的 Switch 一样,先判断 isLayoutRtl()

Support for latest API level

Hello,

We are currently using your library in one of our applications. Actually we need a favour from your side. According to the Google Play Policy, all apps have to provide support for at least API level 26. It seems like yours is not as per the new google play policy. We are targeting API level 28. So can you please provide us support for API level 28 in your current repository?

需要在onCheckedChanged中切换状态,应该怎么实现?

比如有这么一个需求,点击switch开关,点击后会有个网络请求,需要根据请求返回的状态来设置这个开关的状态,这样的话就需要在onCheckedChanged中使用setChecked(isChecked)方法,可是这种方式被弄成异常抛出了,请问是否有其他方式可以实现?

Error inflating class com.suke.widget.SwitchButton

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.improlabs.optima.ucs/com.improlabs.optima.ucs.MainActivity}: android.view.InflateException: Binary XML file line #185: Error inflating class com.suke.widget.SwitchButton
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #185: Error inflating class com.suke.widget.SwitchButton
at android.view.LayoutInflater.createView(LayoutInflater.java:613)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at com.improlabs.optima.fragments.SettingsFragment.onCreateView(SettingsFragment.java:80)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1234)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2046)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:174)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:597)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1163)
at android.app.Activity.performStart(Activity.java:5018)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2032)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
at android.app.ActivityThread.access$600(ActivityThread.java:130) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4745) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method) 

switchButton.setOnClickListener不执行!

switchButton.setOnClickListener方法监听没效果!
只能监听switchButton.setOnCheckedChangeListener。
但是setOnCheckedChangeListener方法在只要有控件状态改变就会执行!
比如:网络请求成功,需要改变按钮状态,改完以后会自动执行setOnCheckedChangeListener的方法,执行一遍!这是错误的!
所以需要改一下switchButton.setOnClickListener这个方法!

CANNOT use Databinding with attr: sb_checked

<com.suke.widget.SwitchButton
android:layout_centerInParent="true"
android:layout_width="45dp"
android:layout_height="25dp"
app:sb_checked="@={model.enable}"
app:sb_checkline_color="@color/shiny_blue"
app:sb_show_indicator="false"
/>

Cannot find a getter for <com.suke.widget.SwitchButton app:sb_checked> that accepts parameter type 'java.lang.Boolean'

If a binding adapter provides the getter, check that the adapter is annotated correctly and that the parameter type matches.
Open File

Highly recommand to add databinding support!

Cannot find the setter for attribute 'android:onCheckedChanged' with parameter type com.suke.widget.SwitchButton.OnCheckedChangeListener on com.suke.widget.SwitchButton

on Layout:

<layout>
   <data>
        <variable
            name="mySwitch"
            type="com.suke.widget.SwitchButton.OnCheckedChangeListener" />

        <variable
            name="viewModel"
            type="mypackage.MyViewModel" />
    </data>
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <com.suke.widget.SwitchButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="@{viewModel.isChecked}"
                android:onCheckedChanged="@{mySwitch}" />
    </LinearLayout>
</layout>

on Activity:

MyActivity implements SwitchButton.OnCheckedChangeListener {
        ....
        binding.setOrphanSwitch(this);
        ....
       @Override
       public void onCheckedChanged(SwitchButton view, boolean isChecked) {
              Logger.v(isChecked+"");
        }
   ...
}

Error:
Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'android:onCheckedChanged' with parameter type com.suke.widget.SwitchButton.OnCheckedChangeListener on com.suke.widget.SwitchButton.
file:C:...\my_fragment.xml
loc:132:44 - 132:55
****\ data binding error ****

Color selector for enabled disabled state not working

I used a color selector for checked_color to disable grey color if the button is disabled (enabled = false) but it is taking no effect.

Like so-

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- disabled state -->
    <item android:color="@color/grey" android:state_enabled="false" />
    <item android:color="@color/blue" />
</selector>

How do I grey out the switch when I disable the button?

Gradle Error v0.0.3 Not Published?

Hi! I am trying to compile using 0.0.3 to fix the 4.1.0 crash issue and it is not completing. Is it just taking a while to propagate? Thank you!

Error:(36, 13) Failed to resolve: com.github.zcweng:switch-button:0.0.3
<a href="openFile:F:/Development/blank-icon/app/build.gradle">Show in File</a><br><a href="open.dependency.in.project.structure">Show in Project Structure dialog</a>

控件是否存在内置Margin或Padding?

从视图查看UI边距,明显可以看到控件距离上下左右都有一定的距离,请问是否存在内置Margin或Padding,有的话是多少?在适配UI的时候明显和设计图的大小不一致。

Changing Button color at runtime from code.

How can i change the color from code.
For example: i have online / offline state.
For online: it becomes green.
For offline: gray color
Now suppose at some point of time i want to show busy instead of online.
For busy i want to change the on color state to red.
How to make this at runtime from code ?

should

should NOT switch the state in method

反馈两个情况

1、mSwitchButton.setEnableEffect(false); 的情况下设置.setChecked(true),不会回调事件
2、快速切换的情况下,动画一直被复位,然后最终结果是false。我的操作是用一个button的点击事件控制,在判断isChecked()为false的情况下设置setChecked(true),在快速点击buttjon,switchbutton最终的结果是false

描述动画与实际不一致

你好,你这儿主页的动画效果展示与实际运行代码跑起来的不一致,这儿的效果是当切换按钮后,开关白色的圆圈到达位置后会有一丁点的后退效果,而实际跑起来则是没有这个效果的!

无法改变开关状态而不进行回调

虽然setCheck(boolean)调用的是toggle(enableEffect, false),但是其动画执行结束的时候还是会回调事件。
我这里仅对于开头被用户打开或关闭需要发送请求,所以加了checked状态改变的监听,而查询到状态时只需要设置开关状态,并不需要发送请求。

另外,有时候不需要开头的线和圆圈的指示器。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.