Android在活动中处理来自同一手势的多个片段动画

时间:2014-07-18 17:05:30

标签: android android-layout android-fragments android-viewpager android-animation

我是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);
        }

    }
}

enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

您可能不想自定义活动的内容视图并覆盖onInterceptTouchEvent以监视分派给子视图的事件。

滚动列表视图时,内容视图应将所有事件分派到列表视图,以便列表可以照常滚动,同时,您可以上下驱动控件。无论您的观点是否构建为片段,都无关紧要。