先放上這個自定義的View的代碼,java
package com.example.viewpagervertical;android
import android.content.Context;eclipse
import android.util.AttributeSet;ide
import android.util.Log;佈局
import android.view.MotionEvent;ui
import android.view.VelocityTracker;this
import android.view.View;spa
import android.view.ViewGroup;.net
import android.view.animation.Interpolator;xml
import android.widget.Scroller;
import android.widget.Toast;
/**
* 實現這個上下滑動的效果,主要利用了屏幕座標系和滾動條
* @author Administrator
*
*/
public class VerticalPager extends ViewGroup{
private Scroller mScroller; //滾動條
private Context mContext;
private final static int RATE = 5; //速率標準
private final static int DISTANCE = 300;//須要滾動的距離
private VelocityTracker mVelocityTracker;//經過此類能夠計算速度
public VerticalPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext=context;
mScroller=new Scroller(context);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int totalHeight=0;
int count=getChildCount();
for(int i=0;i<count;i++){
View childView=getChildAt(i);
childView.layout(l, totalHeight, r, totalHeight+b);
totalHeight+=b;
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width=MeasureSpec.getSize(widthMeasureSpec);
int height=MeasureSpec.getSize(heightMeasureSpec);
int count=getChildCount();
for(int i=0;i<count;i++){
getChildAt(i).measure(width, height);
}
setMeasuredDimension(width, height);
}
private int mLastMotionY;
@Override
public boolean onTouchEvent(MotionEvent event) {
if(mVelocityTracker==null){
mVelocityTracker=VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
int action=event.getAction();
float y=event.getY();
switch(action){
case MotionEvent.ACTION_DOWN:
if(!mScroller.isFinished()){
mScroller.abortAnimation();
}
mLastMotionY=(int) y;
Log.d("montion", ""+getScrollY());
break;
case MotionEvent.ACTION_MOVE:
int deltaY=(int) (mLastMotionY-y);
scrollBy(0,deltaY);
invalidate();
mLastMotionY=(int) y;
break;
case MotionEvent.ACTION_UP:
// if(mVelocityTracker!=null){
// mVelocityTracker.recycle();
// mVelocityTracker=null;
// }
mVelocityTracker.computeCurrentVelocity(1, 1000); //單位爲1說明,一秒一個像素,最大值爲1000
float vy = mVelocityTracker.getYVelocity(); //vy表明Y軸方向的速率
Log.i("test","velocityTraker : "+mVelocityTracker.getYVelocity());
if(getScrollY()<0){
mScroller.startScroll(0, -DISTANCE, 0, DISTANCE);
}else if(getScrollY()>(getHeight()*(getChildCount()-1))){
View lastView=getChildAt(getChildCount()-1);
mScroller.startScroll(0,lastView.getTop()+DISTANCE, 0, -DISTANCE);
}else{
int position=getScrollY()/getHeight();
View positionView = null;
if(vy<-RATE){ //下滑
positionView=getChildAt(position+1);
mScroller.startScroll(0, positionView.getTop()-DISTANCE, 0, +DISTANCE);
}else if(vy>RATE){//上滑
positionView=getChildAt(position);
mScroller.startScroll(0, positionView.getTop()-DISTANCE, 0, +DISTANCE);
}else {
int mod=getScrollY()%getHeight();
if(mod>getHeight()/2){
positionView=getChildAt(position+1);
mScroller.startScroll(0, positionView.getTop()-DISTANCE, 0, +DISTANCE);
}else{
positionView=getChildAt(position);
mScroller.startScroll(0, positionView.getTop()+DISTANCE, 0, -DISTANCE);
}
}
}
invalidate();
break;
}
return true; //返回true表示事件由本View消費掉
}
@Override
public void computeScroll() {
super.computeScroll();
if(mScroller.computeScrollOffset()){
scrollTo(0, mScroller.getCurrY());
}
}
}
而後是佈局文件activity_main.xml:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.example.viewpagervertical.VerticalPager
android:id="@+id/vertyPager1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:background="@drawable/iv_guide1"
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="TextView1111" />
<TextView
android:background="@drawable/iv_guide2"
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="TextView2222" />
<TextView
android:background="@drawable/iv_guide3"
android:id="@+id/textView3"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="TextView2222" />
<TextView
android:background="@drawable/iv_guide4"
android:id="@+id/textView4"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="TextView2222" />
</com.example.viewpagervertical.VerticalPager>
</LinearLayout>
MainActivity.java不用動,由eclipse建立的就行。