【问题标题】:Edge swipe and application exit Android wear 2.0边缘滑动和应用退出 Android Wear 2.0
【发布时间】:2017-04-01 11:35:17
【问题描述】:

我正在为 Android Wear 编写应用程序,我需要在关闭应用程序时在 Android Wear 上实现类似于 Google 地图应用程序的行为。

通常,“Swipe-To-Dismiss”手势(从左向右滑动)会关闭应用程序(活动),但您能想象一下您有图片或地图需要在应用程序中平移的情况吗?从左到右的平移始终关闭应用程序。

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

如果您希望用户向下返回堆栈,您可以将视图包装在一个 SwipeDismissFrameLayout 对象中,该对象支持边缘滑动。边缘 当视图或其子视图从 canScrollHorizo​​ntally() 调用。边缘滑动使用户可以关闭 通过从屏幕的最左侧滑动来查看视图(当前 设置为屏幕宽度的 10%),而不仅仅是视图中的任何位置。

这是在适用于 Android 穿戴设备的 Google 地图应用中实现的。应用程序关闭,以防您开始非常靠近左边缘滑动。它被称为“边缘滑动”。

问题是 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 等已弃用的类并使用电源按钮退出应用程序。

有什么想法或例子吗?

谢谢!

【问题讨论】:

标签: wear-os


【解决方案1】:

尝试使用以下代码禁用滑动关闭:

<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、电源按钮返回到表盘以及 Android Wear 2.0 的其他更改等内容。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我认为你应该扩展 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"
    

    【讨论】:

      【解决方案3】:

      如果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;
                  }
              };
      

      【讨论】:

      • onPreSwipeStart 不是公共方法,你应该如何覆盖它?
      【解决方案4】:

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

      但是,在您给定的布局文件中,唯一包含的视图是股票RelativeLayout,它从canScrollHorizontally() 返回false

      实现目标的一种方法是扩展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"/>
      

      假设你的包名是com.mydomain

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-23
        • 2011-07-30
        • 1970-01-01
        相关资源
        最近更新 更多