2011-02-18 34 views
3

使用widget.Gallery顯示項目的水平滾動列表。我已經實現分頁與什麼似乎是標準的技術畫廊:子類畫廊和實施:將圖庫滾動到下一頁

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     if (velocityX>0) { 
      onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null); 
     } else { 
      onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null); 
     } 
} 

當輕敲畫廊,我消失了一個和上一個圖像按鈕。點擊這些時,我希望畫廊分別動畫到下一個/上一個頁面。我已經嘗試從我的下一個按鈕處理函數調用onKeyDown,但奇怪的是這沒有效果。 AbsSpinner具有setSelection(int position, boolean animate),但在圖庫中會忽略動畫。

+0

您是否確定在UIThread上調用這些方法? – 2011-02-19 06:34:18

+0

是的,他們從onClick回調視圖中調用 - 在主線程上。 – toucan 2011-02-19 08:38:46

+0

如果我將一個標準畫廊放在一個活動中並在模擬器中運行它,似乎仿真器的左右鍵也沒有作用? – toucan 2011-02-19 08:40:59

回答

2

究竟是什麼巨嘴說,而是要闡述(評論限制太短):

問題似乎是事實如果沒有孩子存在於該位置,Gallery不允許用戶滾動。 scrollToChild()試圖注入事件時的罪魁禍首:

private boolean scrollToChild(int childPosition) { 
    View child = getChildAt(childPosition); 

    if (child != null) { 
     int distance = getCenterOfGallery() - getCenterOfView(child); 
     mFlingRunnable.startUsingDistance(distance); 
     return true; 
    } 

    return false; 
} 

有趣的是,如果你一扔用你的手指畫廊,這將導致創建的子。然後,如果你放開你的手指(回到原來的位置),然後然後按下按鈕,激活onKeyDown注射,它將完美地工作 - 因爲孩子在那裏。

不幸的是,沒有真正的解決方案,因爲在該課程中所有內容都是私密的。唯一的解決方案是在畫廊中使用setSpacing(-1)或其他東西,所以左側和右側的孩子總是被創建並可見,但是在當前選擇的視圖後面。

作爲一個腳註,我真的很困惑爲什麼在這個類(或任何其他的Android窗口小部件類)中都是私有的。這是可以通過一些小代碼更改輕鬆解決的問題之一。

編輯(2012年8月):以供將來參考,而不是試圖(如果希望用戶能夠在不同項目之間的滑動,而其中只有一個是可見的)用於這種模式的畫廊,這是多大更好地使用Android的compatibility package's ViewPager class。在我看來,兼容性包並沒有像應該那樣慶祝(我花了一段時間纔得到它的通知)。對於定位Android 2.x +的開發人員來說,這是天賜之物。

2

這是工作

創建2個圖像按鈕和畫廊 如: nextbtn,backbtn和膽

按鈕的代碼是可用的編緝這裏

nextbtn.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     gall.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null); 
    } 
}); 

backbtn.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     gall.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null); 
    } 
});   
0
String strMethod = velocityX > 0 ? "movePrevious" : "moveNext"; 
    try { 
     Method method = Gallery.class.getDeclaredMethod(strMethod, null); 
     method.setAccessible(true); 
     method.invoke(this, null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
相關問題