我应如何在Android中创建自定义开关并在开关的轨道和拇指上双向显示文本?

16

我该如何设计Android中的自定义开关,就像下面的图片:

状态1

当它被打开时,需要看起来像这样

状态2

我还需要在两个类别之间切换时显示切换动画效果。我该如何实现?是否有任何第三方SDK或库可用?目前我已经使用自定义线性布局进行了设计,如下所示:

my_layout.xml:

 <LinearLayout
                android:id="@+id/customSliderLayout"
                android:layout_width="@dimen/_200sdp"
                android:layout_height="@dimen/_39sdp"
                android:layout_centerInParent="true"
                android:orientation="horizontal"
                android:weightSum="2"
                android:background="@drawable/oval_layout_bg"
                android:layout_centerHorizontal="true">

                <Button
                    android:id="@+id/userBtn"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:textAllCaps="false"
                    android:text="@string/toggle_user"
                    android:textSize="@dimen/_18sdp"
                    android:textColor="@color/black_textcolor"
                    android:background="@drawable/back"/>

          <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:textAllCaps="false"
                    android:textColor="@color/textcolor_white"
                    android:textSize="@dimen/_16sdp"
                    android:gravity="center"
                    android:text="@string/toggle_doctor"/>

            </LinearLayout>

但我需要设计一个切换开关。

我也查看了这个库:

https://github.com/gmarm/BetterSegmentedControl

但这仅适用于iOS而不是Android。我需要像链接中的第二个开关一样。


你尝试了哪些代码? - Kristy Welsh
你找到解决方案了吗? - Richa Shah
2个回答

5

您可以根据需要设计的自定义开关。

在滑轨和拇指设计之间存在间隙的问题,以显示我的轨道设计

(在滑轨和拇指设计之间存在的问题) 我希望它看起来像iOS库 https://github.com/gmarm/BetterSegmentedControl

所以我就这样做了 我的方法非常简单,请查看下面的代码。首先将轨道设计添加到RelativeLayout背景上(您可以像使用布局一样使用它)。如果需要,轨道将是透明的或使其变为白色。只需设计您需要的拇指即可。

enter image description here

activity_main.xml

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="33dp"
    android:layout_centerHorizontal="true"
    android:layout_marginHorizontal="10dp"
    android:layout_marginVertical="80dp"
    android:background="@drawable/bg_switch"
    android:padding="2.5dp">

    <androidx.appcompat.widget.SwitchCompat
        android:id="@+id/switchOnOff"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:checked="true"
        android:textColor="@color/white"
        android:thumb="@drawable/thumb_selector"
        app:switchMinWidth="140dp"
        app:track="@drawable/track_selector" />

    <LinearLayout
        android:layout_width="140dp"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:weightSum="2">

        <TextView
            android:id="@+id/tvSwitchYes"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:gravity="center"
            android:text="Yes"
            android:textColor="#4282DC"
            android:textSize="12sp" />

        <TextView
            android:id="@+id/tvSwitchNo"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:gravity="center"
            android:text="No"
            android:textColor="@color/white"
            android:textSize="12sp" />


    </LinearLayout>


</RelativeLayout>

在drawable文件夹中,有一个名为bg_switch.xml的文件。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white" />
<corners android:radius="6dp" />
<stroke
    android:width="1dp"
    android:color="#4282DC" />
</shape>

在drawable文件中的thumb_selector.xml。

<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false">
    <shape
        android:dither="true" android:shape="rectangle"
        android:useLevel="false" android:visible="true">
        <solid android:color="#4282DC" />
        <corners android:radius="6dp" />
        <size
            android:width="70dp"
            android:height="30dp" />
    </shape>

</item>

</selector>

在drawable文件夹中的track_selector.xml。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
    <shape android:dither="true" android:shape="rectangle"
        android:useLevel="false" android:visible="true">
        <solid android:color="@color/white" />
        <corners android:radius="6dp" />
        <size android:width="100dp"
            android:height="30dp" />
    </shape>
</item>
<item android:state_checked="false">
    <shape android:dither="true" android:shape="rectangle"
        android:useLevel="false" android:visible="true" >
        <corners android:radius="6dp" />
        <size
            android:width="100dp"
            android:height="30dp" />
        <solid android:color="@color/white" />
    </shape>
</item>
</selector>

MainActivity.kt

class MainActivity : AppCompatActivity() {

private lateinit var switchOnOff: SwitchCompat
private lateinit var tvSwitchYes: TextView
private lateinit var tvSwitchNo: TextView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    switchOnOff = findViewById<SwitchCompat>(R.id.switchOnOff)
    tvSwitchYes = findViewById<TextView>(R.id.tvSwitchYes)
    tvSwitchNo = findViewById<TextView>(R.id.tvSwitchNo)
    switchOnOff.setOnCheckedChangeListener { _, checked ->
        when {
            checked -> {        
       tvSwitchYes.setTextColor(ContextCompat.getColor(this,R.color.blue_color))
       tvSwitchNo.setTextColor(ContextCompat.getColor(this,R.color.white))
            }
            else -> {         
       tvSwitchYes.setTextColor(ContextCompat.getColor(this,R.color.white))
       tvSwitchNo.setTextColor(ContextCompat.getColor(this,R.color.blue_color))
            }
        }
    }
}
}


  

4

这有点棘手,因为你不能在轨道上写任何东西,所以你需要一个文本视图来放置你的轨道文本,并在需要时简单地更改其位置。 准备好你的形状或图像,然后在约束布局中使用开关和文本视图...将它们匹配到你需要它们的同一位置,然后进行编码,当开关打开/关闭时,将文本视图移动到另一侧... 哈哈,它完美地工作了... 对于拇指文本:

    cSwitch.setTextOn("doctor");
    cSwitch.setTextOff("user");

我知道它还有很大的提升空间,但这就是我的做法,你可以更改形状的宽度和高度...
这是我的代码,我没有做出你需要的东西,哈哈,你必须自己完成。
希望这些能有所帮助...干杯! 输入图像描述 输入图像描述 切换轨道形状
 <?xml version="1.0" encoding="utf-8"?>
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
     <item
         android:width="11mm"
         android:height="4.2mm">
         <shape android:shape="rectangle">
             <corners android:radius="3.7mm" />
             <stroke
                 android:width="0.3mm"
                 android:color="@color/white" />
             <solid android:color="@color/green" />
         </shape>
     </item>
 </layer-list>

切换缩略图形状

 <?xml version="1.0" encoding="utf-8"?>
  <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
     <size
        android:width="4.2mm"
        android:height="4.2mm" />
    <corners android:radius="2mm" />
    <solid android:color="@color/white" />
    <stroke
        android:width="1dp"
        android:color="#bdf7b8" />
</shape>

布局XML代码

 <android.support.constraint.ConstraintLayout
    android:id="@+id/signInLayout"
    style="@style/LayoutStyle"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical"
    android:layout_marginTop="16dp">

 <Switch
        android:id="@+id/cSwitch"
        android:layout_width="wrap_content"
        android:layout_height="4mm"
        android:switchMinWidth="11mm"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/cSwitch_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="2mm"
        android:layout_marginStart="2mm"
        android:text="ON"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="@id/cSwitch"
        app:layout_constraintLeft_toLeftOf="@+id/cSwitch"
        app:layout_constraintTop_toTopOf="@id/cSwitch" />
</android.support.constraint.ConstraintLayout>

和 Java 代码

    final Switch cSwitch = rootView.findViewById(R.id.cSwitch);
    final TextView cSwitchText = rootView.findViewById(R.id.cSwitch_textView);
    cSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            ConstraintLayout constraintLayout = rootView.findViewById(R.id.signInLayout);
            ConstraintSet constraintSet = new ConstraintSet();
            constraintSet.clone(constraintLayout);
            constraintSet.connect(R.id.cSwitch_textView, ConstraintSet.TOP, R.id.cSwitch, ConstraintSet.TOP, 0);
            constraintSet.connect(R.id.cSwitch_textView, ConstraintSet.BOTTOM, R.id.cSwitch, ConstraintSet.BOTTOM, 0);
            cSwitch.setThumbDrawable(rootView.getResources().getDrawable(R.drawable.switch_thumb_green));

            if (isChecked) {
                cSwitchText.setText("ON");
                constraintSet.connect(R.id.cSwitch_textView, ConstraintSet.LEFT, R.id.cSwitch, ConstraintSet.LEFT, 0);
                constraintSet.connect(R.id.cSwitch_textView, ConstraintSet.RIGHT, ConstraintSet.UNSET, ConstraintSet.RIGHT, 0);
                cSwitch.setTrackDrawable(ContextCompat.getDrawable(rootView.getContext(), R.drawable.switch_track_green));
            } else {
                cSwitchText.setText("OFF");
                constraintSet.connect(R.id.cSwitch_textView, ConstraintSet.RIGHT, R.id.cSwitch, ConstraintSet.RIGHT, 0);
                constraintSet.connect(R.id.cSwitch_textView, ConstraintSet.LEFT, ConstraintSet.UNSET, ConstraintSet.LEFT, 0);
                cSwitch.setTrackDrawable(ContextCompat.getDrawable(rootView.getContext(), R.drawable.switch_track_red));
                cSwitch.setThumbDrawable(rootView.getResources().getDrawable(R.drawable.switch_thumb_red));
            }
            constraintSet.applyTo(constraintLayout);

        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接