安卓滑动开关

30

请问有没有关于Android的开源幻灯片切换实现?默认的Android幻灯片切换(ToggleButton)不太美观。我正在寻找任何类似于iOS的东西。我应该能够从头开始实现一个。但如果已经有类似的东西可用,那么我可以在其基础上进行构建。

感谢stackoverflow社区提供的帮助。

编辑1: 我所指的iOS滑动切换是UISwitch

ios Toggle Button



编辑2:只是想总结一下答案。Commonsware给了线索。我最终回溯了4.0版中的Switch代码到2.2.2版。由于开源代码的帮助,回溯并不困难。该代码托管在github上。http://github.com/pellucide/Android-Switch-Demo-pre-4.0/tree/master/

该项目的屏幕截图
Screen shot


3
我把4.0的代码移植到了2.2.2版本。我还添加了一些新的属性来适应我正在开发的项目。虽然它的外观不完全像iOS或Android,但可以通过可绘制对象轻松更改它的外观。该项目托管在github上。https://github.com/pellucide/Android-Switch-Demo-pre-4.0/tree/master/android-switch-demo - pellucide
哇!干得好。我也希望在我换皮肤切换按钮之前看到这个。https://dev59.com/cmkw5IYBdhLWcg3wZJt-#15640365 - dberm22
先生,我在这个项目中遇到了问题,即如果我使用相同的资源和一切,开关在 xhdpi 设备上会变灰。我可能漏掉了什么?但是,如果我在同一设备上运行您的项目,则一切正常。我也在使用 action sherlock bar 和多个值文件夹。请帮忙,谢谢 @pellucide - Rat-a-tat-a-tat Ratatouille
@Ratatouille 请在 Github 页面上报告问题。我很乐意查看它。 - pellucide
当应用程序在后台运行并将被恢复时,它在此处崩溃(Android开关演示)。private Layout makeLayout(CharSequence text) { return new StaticLayout(text, mTextPaint, (int) android.util.FloatMath.ceil(Layout.getDesiredWidth(text, mTextPaint)), Layout.Alignment.ALIGN_NORMAL, 1.f, 0, true); }我猜这是因为变量是静态的。解决方案是什么? - fish40
显示剩余2条评论
4个回答

15

在Android中,您可以使用滑动抽屉小部件来实现滑动切换开关。您只需要将iOS切换图像“切分”为3个部分:一个用于句柄、一个用于滑动抽屉背景、一个用于内容部分。然后在其上方放置一张图片,例如框架,以给您“圆角”。

以下是我的解决方案:

XML布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="100dp" >
        <SlidingDrawer
            android:id="@+id/slidingDrawer1"
            android:layout_width="154dp"
            android:layout_height="54dp"
            android:background="@drawable/ios_retina_toggle_on_full"
            android:content="@+id/content"
            android:handle="@+id/handle"
            android:orientation="horizontal" >
            <ImageButton
                android:id="@+id/handle"
                android:layout_width="54dp"
                android:layout_height="54dp"
                android:background="#00000000"
                android:src="@drawable/ios_retina_toggle_button" />
            <ImageView
                android:id="@+id/content"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ios_retina_toggle_off" />
        </SlidingDrawer>
        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ios_retina_toggle_frame" />
    </FrameLayout>
</LinearLayout>

ios_retina_toggle_on_full
ios_retina_toggle_on_full.png

ios_retina_toggle_button
ios_retina_toggle_button.png

ios_retina_toggle_off
ios_retina_toggle_off.png

ios_retina_toggle_frame
ios_retina_toggle_frame.png

最后是在运行 gingerbread 的 3.7 WVGA 屏幕模拟器上的截图: enter image description here


这是一个聪明的方法。我今天会尝试一下。然而,我已经从Android 4.0“Switch”中获取了代码,并对其进行了适配以在Android 2.2.x上运行。我成功地添加了一些额外的功能,例如textOnButton和textOutside。textOnButton-将文本放置在按钮(圆形)上,除了轨道上的文本。 textOutside-将文本放置在轨道外。 - pellucide
你能提供一个例子或源代码吗?如果你能的话,那会非常有用,因为我也在尝试做同样的事情。 - neteinstein
@user892771,你真的很努力,太棒了!我已经把你的项目和BoD的项目加入我的关注列表。谢谢大家! - vinceville
1
你能不能只使用两个透明的PNG图片,而不是使用四张图片呢?! - Phantômaxx
我想是这样,但当我回答这个问题的时候,我没有足够的时间来编辑带有透明度的iOS切换按钮。;) - vinceville
显示剩余3条评论

13
根据谷歌搜索,iOS似乎没有名为“slide toggle”的控件,而且您没有提供您想要的图像(或图像链接)。 Android 4.0添加了一个称为 Switch 的控件,您可以将其迁移到早期版本。 您可以在模拟器上的API Demos应用程序中看到它的样例:

enter image description here


这很接近了。我必须回溯转移 Switch 代码。谢谢! - pellucide
1
你是如何进行回溯端口的? - Mihai Bratulescu

1
我们可以尝试使用自定义的可拖动进度条和拇指,将最大值设置为1,最小值设置为0。我们可以添加滑动效果的动画。

1

您可以尝试使用ToggleButton,为其状态指定自己的可绘制对象。


2
可以这样做。但是我想要从一个状态滑动到另一个状态的效果。这会给人一种物理上滑动开关的感觉。 - pellucide
1
ToggleButtons没有滑动效果。 - Phantômaxx

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