0

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

    } 
} 

enter image description here enter image description here

回答

0

你可能不希望自定義活動的內容視圖,並覆蓋onInterceptTouchEvent監視事件分派給子視圖。

當您滾動列表視圖時,內容視圖應該將所有事件分派到列表視圖,以便列表可以像平常一樣滾動,同時,您可以上下驅動控件。無論您的觀點是否構建爲片段,都沒有關係。

相關問題