我是Android新手,我有一个非常不寻常的设计来实现..我很难搜索现有问题/解决方案,因为我可能不了解问题精确..我所知道的是我想要实现的..Android在活动中处理来自同一手势的多个片段动画
我花了一个下午建立了我的MainActivity,其中包含一个FragmentViewPager和一个固定的片段在屏幕的底部+重叠寻呼机视图。从以下屏幕截图中可以看到,我可以左右滑动以浏览天气和联系人视图。同时,控制面板始终位于底部。
接下来就是添加一些动画。我想要实现的是......如果用户向下滚动联系人列表(或者在其他滑动页面中执行相同的手势,例如黄色的天气屏幕),我会让控制面板向下滑动(仍有小的边距显示)屏幕稍后用户可以点击将其拉回)。
问题是如果我添加dispatchTouchEvent(出于某些未知原因,onTouchEvent不适用于我,我不得不使用dispatch),我将覆盖现有的手势行为 - 意味着只有控制面板会滑下,但我无法再滚动联系人列表,也无法左右滑动浏览ViewPager中的不同页面。
我不知道如何在不删除联系人列表中的现有滚动行为以及在FragmentViewPager中启用的滑动手势(不同子屏幕之间的滑动效果)的情况下添加其他滚动向下/向上检测器。
下面是MainActivity的实现。请注意,我的滚动检测可能不准确,首先需要进行测试......并且我已经卡住了。
public class MainActivity extends FragmentActivity {
static final String DEBUG_TAG = "MainActivity";
static final int NUM_ITEMS = 3;
private FragmentPagerAdapter mAdapter;
private ViewPager mPager;
private GestureDetector mGestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getActionBar();
actionBar.hide();
setContentView(R.layout.activity_main);
mAdapter = new DashboardAdapter(getSupportFragmentManager());
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mPager.setCurrentItem(1);
mGestureDetector = new GestureDetector(this, new MainGestureDetector(this.getApplicationContext(), findViewById(R.id.container)));
}
@Override
public boolean dispatchTouchEvent(MotionEvent me) {
return mGestureDetector.onTouchEvent(me);
}
public static class DashboardAdapter extends FragmentPagerAdapter {
public DashboardAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new WeatherFragment();
case 1:
return new FavoritesListFragment();
case 2:
return new ChildrenLocatorFragment();
default:
return null;
}
}
}
private class MainGestureDetector extends GestureDetector.SimpleOnGestureListener {
private Context myContext;
private View myView;
public MainGestureDetector(Context context, View view) {
myContext = context;
myView = view;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString());
Animation slideAnimation = AnimationUtils.loadAnimation(myContext, R.anim.slide_down);
LinearLayout controlPanel = (LinearLayout)myView.findViewById(R.id.control_panel);
controlPanel.startAnimation(slideAnimation);
return super.onScroll(e1, e2, distanceX, distanceY);
}
}
}