大家都使用過viewpager,但是viewpager還有乙個兄弟,那就是viewflipper。兩者的名字非常相似,我們可以將viewpager理解成「一頁一頁的檢視」,viewflipper則是「快速翻轉的檢視」,但後者的使用率卻遠不及前者,不過這並不意味著viewflipper就弱了。現在我們就來拜訪一下經常被冷落的viewflipper。
在android studio中新建乙個工程,實現這樣乙個效果:建立紅、橙、綠、藍四種顏色的頁面,然後通過viewflipper讓它們來回切換。四個頁面布局檔案的名稱如下所示:
item_view1.xml的**如下:
<?xml version="1.0" encoding="utf-8"?>
另外三個布局的**只要把背景色換掉就可以了。
頁面建立好了,那我們怎麼把它放置到viewflipper中呢?很簡單,viewflipper支援include
標籤新增頁面,我們只需在activity_main.xml中將四個布局依次include進去即可。
直接執行就可以看到下面的效果了:
除了直接在布局檔案中新增頁面外,也可以在**中新增,把activity_mai.xml中include
標籤注釋掉,然後在mainactivity中初始化viewflipper之後再新增如下的**:
//要新增的頁面布局id
private int viewids = ;
/*** 將頁面新增進viewflipper
*/private void addviews()
}
然後在oncreate中呼叫addviews方法即可。
頁面切換的效果我們是實現了,但是沒有變化過程,看起來太生硬了,累眼睛。如果能有動畫效果的話就會舒服很多。這裡,我們就要用到兩個新屬性了:
left_in.xml
檢視從左邊進入介面的動畫:
<?xml version="1.0" encoding="utf-8"?>
left_out.xml檢視從左邊退出介面的動畫:
<?xml version="1.0" encoding="utf-8"?>
right_in.xml
<?xml version="1.0" encoding="utf-8"?>
right_out.xml
<?xml version="1.0" encoding="utf-8"?>
現在我們先來試試從左往右轉的動畫效果。在布局中給viewflipper加上如下的屬性:
android:inanimation="@anim/left_in"
android:outanimation="@anim/right_out"
執行一下,就可以實現從左往右滑動的動畫效果了(gif圖有點失真,不過效果是沒問題的)。
相信不用我說,你也知道怎麼讓它從右往左滑動了吧?
看著畫面自顧自地滑動,是不是心癢癢的?沒關係,下面我們就來讓它響應我們手指的滑動。在此之前,先做點準備工作:前往布局檔案,去掉動畫屬性,並將autostart
屬性設為false。
要讓它聽從「指揮」,我們可以先繼承ontouchlistener介面,然後實現ontouch
方法:
private float startx; //手指按下時的x座標
private float endx; //手指抬起時的x座標
private float movex = 100f; //判斷是否切換頁面的標準值
/*** 觸控監聽事件
* @param v
* @param event
* @return
*/@override
public boolean ontouch(view v, motionevent event) else if (startx - endx > movex)
break;
}return true;
}
上面的**不難,注釋也寫得比較清楚了。總體的思路就是獲取手指按下和抬起時的座標,然後判斷是向左還是向右滑動。值得注意的是showprevious
和shownext
方法,前者是顯示上乙個檢視,後者則是顯示後乙個檢視。最後還要記住,返回值要改為true,否則觸控事件是無法響應的。
效果圖如下,可以向左,也可以向右。
除了觸控監聽事件之外,我們也可以用手勢監聽事件ongesturelistener
實現同樣的效果,但繼承了該介面之後要實現一連串的方法,**一下子膨脹起來了,而我們需要的只是其中乙個方法啊。好在android還提供了乙個類******ongesturelistener
,這樣我們只要自定義乙個類繼承它,然後實現我們需要的方法就可以了:
//建立手勢***
gesturedetector gesturedetector = new gesturedetector(this, new mygesturelistener());
/*** 自定義手勢監聽類
*/class mygesturelistener extends gesturedetector.******ongesturelistener else if (e2.getx() - e1.getx() < movex)
return true;}}
這裡的onfling
方法得解釋一下,它表示的是手指在螢幕上移動然後鬆開的手勢,也就是滑動。前面兩個引數分別表示手指按下和鬆開時的事件,通過它們的物件去呼叫getx()方法就可以獲取滑動前後的座標了。後面的步驟就跟我們在觸控事件裡面的一樣,相信你能理解的。
我一開始以為到這裡就大功告成了,可執行之後卻紋絲不動!仔細檢視文件,發現還必須到觸控監聽方法中呼叫ontouchevent方法才行,否則觸控事件不會起作用的。
@override
public boolean ontouch(view v, motionevent event)
viewflipper的用法就告一段落了,寫這篇文章的時候我還順便複習了手勢監聽事件等知識,也希望你能有所收穫。下面是原始碼:
viewflipperdemo
谷歌官方文件之viewflipper
android的手勢操作識別
一 Android控制項選擇之ViewFlipper
1 當scrollview失敗時,找到了viewflipper控制項,此控制項可以左右滑動,而且可以喝listview控制項結合來達到上下左右滑動的效果。用到了viewflipper控制項 animation動畫 手勢類gesturedetector。viewanimator繼承至於framelay...
android 迴圈滾動控制項ViewFlipper
布局 xmlns android xmlns tools android layout width match parent android layout height match parent tools context com.sign.demo.mainactivity android id ...
android之interpolator的用法詳解
acceleratedecelerateinterpolator 在動畫開始與結束的地方速率改變比較慢,在中間的時候加速 accelerateinterpolator 在動畫開始的地方速率改變比較慢,然後開始加速 anticipateinterpolator 開始的時候向後然後向前甩 anticip...