天天看點

Android 視圖切換效果

 我們先來看看效果圖:

Android 視圖切換效果

       上述截圖,是手指拖動的效果,如果拖動過螢幕中點,松手後就會自動移動到第二屏。另外,如果使用輕掃手勢,也可以自動移動下一屏。

        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方法中做了處理。

繼續閱讀