我正在为Android服装编写应用程序,我需要在关闭应用程序时实现与Android上的谷歌地图应用程序相似的行为。
通常,“滑动到解除”手势(从左向右滑动)会关闭应用程序(活动),但是您能想象出有图片或地图的情况,您需要在应用程序中平移。从左到右的平移始终关闭应用程序。
Google应该在https://developer.android.com/training/wearables/ui/exit.html#swipe-to-dismiss上描述一个解决方案。
如果您希望用户沿着后向堆栈向下移动,可以将视图包装在支持边缘滑动的SwipeDismissFrameLayout对象中。边缘 当视图或其子视图从a返回true时,将启用滑动 canScrollHorizontally()调用。边缘滑动使用户可以解雇 从屏幕最左侧滑动视图(目前 设置为屏幕宽度的10%),而不仅仅是视图中的任何位置。
这是在谷歌地图应用程序中实现的Android版本。如果您开始非常靠近左边缘滑动,应用程序将关闭。它被称为“边缘滑动”。
问题是canScrollHorizontally()必须返回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这样的弃用类,并使用电源按钮退出应用程序。
任何想法或例子怎么做?
谢谢!
答案 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"/>
。