我在画廊里有一张地图,还有其他几页。当我用触摸手势滑动图片库页面时,一切都很好。但是,当我使用对话框上的一个按钮将地图移开,然后滑回地图时,地图就不再平滑地跟随摇摄手势。但随后却出现了明显的拖延。一旦我再次用对话框隐藏地图并关闭对话框,例如使用back按钮,行为就会恢复正常。
为了重现它,我已经尽可能地简化了代码。
库包含一个DummyView,然后是一个MapView,最后是一个作为页面的DummyView。DummyView和GalleryView作为本地类添加到活动中。
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:
<?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 <-> 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:
<?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>布局在图库顶部添加两个按钮。第一个打开一个对话框,允许在图片库中来回切换。第二个按钮切换映射行为。它既可以是平移的,也可以是它的整页可以滑到左边或右边。当使用第一个按钮将地图分页,然后使用幻灯片手势向后滑动时,就会出现问题。
第二个按钮允许关闭地图平移,因此地图在通常的图库滑动上作出反应。当地图被用滑动手势来回传呼时,平移操作之后就没有问题了(在第二个按钮再次按下之后)。
知道吗,为什么会发生这种情况,以及如何避免?
发布于 2014-08-18 14:40:40
片段事务是在对话框关闭之前执行的,这会导致奇怪的行为。
与其直接执行片段事务,不如将其张贴在Handler上。一旦对话框关闭,那么片段事务就会被执行。
试试下面的代码。我应用了与在我的SO answer中所做的相同的逻辑。
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);
}
});
}https://stackoverflow.com/questions/21516008
复制相似问题