android上下滑动View的实现

先放上这个自定义的View的代码,


package com.example.viewpagervertical;



import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.VelocityTracker;

import android.view.View;

import android.view.ViewGroup;

import android.view.animation.Interpolator;

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创建的就行。



转载于:https://my.oschina.net/u/1463920/blog/362360

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值