我們先來看看效果圖:
上述截圖,是手指拖動的效果,如果拖動過螢幕中點,松手後就會自動移動到第二屏。另外,如果使用輕掃手勢,也可以自動移動下一屏。
android中的view有兩個子類,widget和viewgroup,widget是可見的視窗元件,比如按鈕,viewgroup就是布局,viewgroup已經提供了多個布局子類,比如linearlayout等。
本例中實作了自己的viewgroup子類。通過覆寫onlayout方法實作對子視圖的橫向排列布局:
java代碼:
package eoe. result;
@override
protected void onlayout(boolean changed, int left, int top, int right,
int bottom) {
log.d(tag, ">>left: " + left + " top: " + top + " right: " + right
+ " bottom:" + bottom);
/**
* 設定布局,将子視圖順序橫屏排列
*/
for (int i = 0; i < getchildcount(); i++) {
view child = getchildat(i);
child.setvisibility(view.visible);
child.measure(right – left, bottom – top);
child.layout(0 + i * getwidth(), 0, getwidth() + i * getwidth(),
getheight());
複制代碼
通過覆寫computescroll方法,計算移動螢幕的位移和重新繪制螢幕:
public void computescroll() {
if (scroller.computescrolloffset()) {
scrollto(scroller.getcurrx(), 0);
postinvalidate();
}
編寫了一個名為scrolltoscreen的方法,用于根據指定螢幕号切換到該螢幕:
* 切換到指定屏
*
* @param whichscreen
public void scrolltoscreen(int whichscreen) {
if (getfocusedchild() != null && whichscreen != currentscreenindex
&& getfocusedchild() == getchildat(currentscreenindex)) {
getfocusedchild().clearfocus();
final int delta = whichscreen * getwidth() – getscrollx();
scroller.startscroll(getscrollx(), 0, delta, 0, math.abs(delta) * 2);
invalidate();
currentscreenindex = whichscreen;
snaptodestination方法,是處理當螢幕拖動到一個位置松手後的處理:
* 根據目前x坐标位置确定切換到第幾屏
private void snaptodestination() {
scrolltoscreen((getscrollx() + (getwidth() / 2)) / getwidth());
然後說說手勢事件的處理。eric的實作,全部使用ontouch事件處理,這樣代碼不夠簡明。因為需要記錄很多組合手勢的曆史資料,這樣就必須有一些狀态位,一些坐标數值。
我用gesturedetector的手勢處理事件簡化了這方面的處理,隻在手勢擡起(up)事件進行中在outouchevent方法中做了處理。