边缘滑动和应用程序退出Android Wear 2.0

时间:2017-04-01 11:35:18

标签: wear-os

我正在为Android服装编写应用程序,我需要在关闭应用程序时实现与Android上的谷歌地图应用程序相似的行为。

通常,“滑动到解除”手势(从左向右滑动)会关闭应用程序(活动),但是您能想象出有图片或地图的情况,您需要在应用程序中平移。从左到右的平移始终关闭应用程序。

Google应该在https://developer.android.com/training/wearables/ui/exit.html#swipe-to-dismiss上描述一个解决方案。

  

如果您希望用户沿着后向堆栈向下移动,可以将视图包装在支持边缘滑动的SwipeDismissFrameLayout对象中。边缘   当视图或其子视图从a返回true时,将启用滑动   canScrollHorizo​​ntally()调用。边缘滑动使用户可以解雇   从屏幕最左侧滑动视图(目前   设置为屏幕宽度的10%),而不仅仅是视图中的任何位置。

这是在谷歌地图应用程序中实现的Android版本。如果您开始非常靠近左边缘滑动,应用程序将关闭。它被称为“边缘滑动”。

问题是canScrollHorizo​​ntally()必须返回true并且我无法正确设置此视图属性 - 它始终为false。 https://developer.android.com/reference/android/support/wearable/view/SwipeDismissFrameLayout.html

布局文件。

<?xml version="1.0" encoding="utf-8"?>
<android.support.wearable.view.SwipeDismissFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/swipe_dismiss_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:isScrollContainer="true"
    android:nestedScrollingEnabled="true"
    tools:context="jhettler.wearmaps.MainActivity"
    tools:deviceIds="wear">

    <RelativeLayout
        android:id="@+id/map_area"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fadeScrollbars="false"
        android:isScrollContainer="true"
        android:nestedScrollingEnabled="true">

    </RelativeLayout>

</android.support.wearable.view.SwipeDismissFrameLayout>

我不想实现像DismissOverlayView这样的弃用类,并使用电源按钮退出应用程序。

任何想法或例子怎么做?

谢谢!

4 个答案:

答案 0 :(得分:0)

尝试使用以下代码禁用滑动即可解雇:

<resources>
  <style name="AppTheme" parent="@android:style/Theme.DeviceDefault">
    <item name="android:windowSwipeToDismiss">false</item>
  </style>
</resources> 
  

通常不建议禁用滑动到解除,因为用户希望通过滑动来关闭任何屏幕。在特殊情况下,您可以将windowSwipeToDismiss设置为false,用户可以按电源按钮退出您的应用。

这可以在Android Wear 2.0的Behavior Changes文档中找到。这里讨论了重新引入Swipe-to-Dismiss,电源按钮返回Watch Face以及Android Wear 2.0的其他更改等内容。

希望这有帮助。

答案 1 :(得分:0)

我认为你应该扩展SwipeDismissFrameLayout并创建一个自定义类。

我对此代码没有任何问题。

public class MySwipeDismissFrameLayout extends SwipeDismissFrameLayout {
    public MySwipeDismissFrameLayout(Context context) {
        super(context);
    }

    public MySwipeDismissFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MySwipeDismissFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected boolean canScroll(View v, boolean checkV, float dx, float x, float y) {
        return true;
    }
}

<?xml version="1.0" encoding="utf-8"?>
<com.example.MySwipeDismissFrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"

答案 2 :(得分:0)

如果MySwipeDismissFrameLayout包含可滚动视图,则Yu Kobayashi的答案有效。 如果不存在可滚动视图,则可以使用onPreSwipeStart

        new SwipeDismissFrameLayout.Callback() {

            @Override
            public boolean onPreSwipeStart(float xDown, float yDown) {
                Display display = getActivity().getWindowManager().getDefaultDisplay();
                Point displaySize = new Point();
                display.getSize(displaySize);
                return xDown < displaySize.x / 10;
            }
        };

答案 3 :(得分:0)

正如您在Android开发人员文档中所述,要激活边缘滑动,您的SwipeDismissFrameLayout实例或其至少一个包含的视图必须在其方法{{1}时返回true调用。

但是,在您指定的布局文件中,唯一包含的视图是库存canScrollHorizontally(),它会从RelativeLayout返回false

实现目标的一种方法是扩展canScrollHorizontally(),然后覆盖其方法View,最低限度为:

canScrollHorizontally()

然后在您的布局文件中,在public class MyView extends View { public MyView(Context context) { super(context); } @Override public boolean canScrollHorizontally(int direction) { return true; } } 内,放置:

SwipeDismissFrameLayout

假设您的包名为 <com.mydomain.MyView android:id="@+id/myView" android:layout_width="match_parent" android:layout_height="match_parent"/>