首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在图片库中的地图被一个对话框移走后,延迟平移。

在图片库中的地图被一个对话框移走后,延迟平移。
EN

Stack Overflow用户
提问于 2014-02-02 20:46:32
回答 1查看 223关注 0票数 3

我在画廊里有一张地图,还有其他几页。当我用触摸手势滑动图片库页面时,一切都很好。但是,当我使用对话框上的一个按钮将地图移开,然后滑回地图时,地图就不再平滑地跟随摇摄手势。但随后却出现了明显的拖延。一旦我再次用对话框隐藏地图并关闭对话框,例如使用back按钮,行为就会恢复正常。

为了重现它,我已经尽可能地简化了代码。

库包含一个DummyView,然后是一个MapView,最后是一个作为页面的DummyView。DummyView和GalleryView作为本地类添加到活动中。

代码语言:javascript
运行
复制
public class MainActivity extends FragmentActivity {

private static final int REQUEST_CODE_RECOVER_PLAY_SERVICES = 0;
private Gallery gallery;
private MapView mapView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_map_in_gallery);
    final View[] views = new View[3];
    views[0] = new DummyView(this, "Page 1");
    views[1] = mapView = new MapView(this);
    views[2] = new DummyView(this, "Page 3");
    gallery = (Gallery) findViewById(R.id.gallery);
    BaseAdapter adapter = new ArrayAdapter<View>(this, 0, views) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return views[position];
        }
    };
    gallery.setAdapter(adapter);
    // Let every page cover the whole screen
    gallery.setUnselectedAlpha(1);
    gallery.setSpacing(30);
}

@Override
protected void onResume() {
    super.onResume();
    checkPlayServices();
};

@Override
/** Define the dialog, which appears, when the Page-Button is pressed and
 * which allows to page in the gallery instead of swiping.
 */
protected Dialog onCreateDialog(int id) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Page");
    builder.setPositiveButton("->", new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            page(+1);
        }
    });
    builder.setNegativeButton("<-", new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            page(-1);
        }
    });
    return builder.create();
}

private void page(int increment) {
    int count = gallery.getAdapter().getCount();
    int nextPos = gallery.getSelectedItemPosition() + increment;
    if (nextPos >= count) {
        nextPos = 0;
    } else if (nextPos < 0) {
        nextPos = count - 1;
    }
    gallery.setSelection(nextPos);
}

private boolean checkPlayServices() {
    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (status != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(status)) {
            showErrorDialog(status);
        } else {
            Toast.makeText(this, "This device is not supported.",
                    Toast.LENGTH_LONG).show();
            finish();
        }
        return false;
    }
    return true;
}

void showErrorDialog(int code) {
    GooglePlayServicesUtil.getErrorDialog(code, this,
            REQUEST_CODE_RECOVER_PLAY_SERVICES).show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case REQUEST_CODE_RECOVER_PLAY_SERVICES:
        if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "Google Play Services must be installed.",
                    Toast.LENGTH_SHORT).show();
            finish();
        }
        return;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

public void onButtonClick1(View v) {
    showDialog(0); // Only one dialog defined
}

public void onButtonClick2(View v) {
    mapView.togglePanOrSlide();
}
}

class DummyView extends View {

private String text;
private Paint paint;

/** Simple view which draws a text in the center of the screen. */
public DummyView(Context context, String text) {
    super(context);
    this.text = text;
    paint = new Paint();
    paint.setColor(Color.WHITE);
    paint.setTextSize(20);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawText(text, getWidth() / 2, getHeight() / 2, paint);
}

}

class MapView extends RelativeLayout {

/** Switches the map gestures off, to allow sliding the map in the gallery. */
private boolean panAllowed;

public MapView(Context context) {
    super(context);
    inflate(context, R.layout.map_fragment, this);
}

public void togglePanOrSlide() {
    panAllowed = !panAllowed;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (!panAllowed) {
        // Catch the event from the map, so the gallery will slide the page
        // instead.
        return true;
    }
    return super.onInterceptTouchEvent(event);
}

}

下面是编码中膨胀的两个布局:

activity_map_in_gallery.xml:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="onButtonClick1"
    android:text="Open Paging Dialog" />

<Button
    android:id="@+id/button2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="onButtonClick2"
    android:text="Pan Map &lt;-> Slide Page" />

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="1" >

    <Gallery
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:background="@android:drawable/alert_dark_frame" />
</RelativeLayout>

</LinearLayout>

和map_fragment.xml:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<!-- Merged into a RelativeLayout-Extension -->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment" />

</merge>

布局在图库顶部添加两个按钮。第一个打开一个对话框,允许在图片库中来回切换。第二个按钮切换映射行为。它既可以是平移的,也可以是它的整页可以滑到左边或右边。当使用第一个按钮将地图分页,然后使用幻灯片手势向后滑动时,就会出现问题。

第二个按钮允许关闭地图平移,因此地图在通常的图库滑动上作出反应。当地图被用滑动手势来回传呼时,平移操作之后就没有问题了(在第二个按钮再次按下之后)。

知道吗,为什么会发生这种情况,以及如何避免?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-18 14:40:40

片段事务是在对话框关闭之前执行的,这会导致奇怪的行为。

与其直接执行片段事务,不如将其张贴在Handler上。一旦对话框关闭,那么片段事务就会被执行。

试试下面的代码。我应用了与在我的SO answer中所做的相同的逻辑。

代码语言:javascript
运行
复制
    private void page(int increment) {
        int count = gallery.getAdapter().getCount();
        int nextPos = gallery.getSelectedItemPosition() + increment;
        if (nextPos >= count) {
            nextPos = 0;
        } else if (nextPos < 0) {
            nextPos = count - 1;
        }
        final int finalNextPos = nextPos;

        Handler handler = new Handler();
        handler.post(new Runnable() {

            @Override
            public void run() {
                gallery.setSelection(finalNextPos);
            }

        });
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21516008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档