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

时间: 2024-08-09 12:41:10

android上下滑动View的实现的相关文章

android新手关于左右滑动的问题,布局把&lt;android.support.v4.view.ViewPager/&gt;&lt;ImageView/&gt; 放在上面就不行了。

============问题描述============ main.xml代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:umadsdk="http://schemas.android.com/apk/res/com.Love

Android——ViewPager滑动背景渐变(自定义view,ViewPager)

效果: ActivityBackgroundImage,java(自定义视图) package com.example.chenshuai.test322; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; impor

详解实现Android中实现View滑动的几种方式

注: 本文提到的所有三种滑动方式的完整demo:ScrollDemo 1. 关于View我们需要知道的 (1)什么是View? Android中的View类是所有UI控件的基类(Base class),也就是说我们平时所有到的各种UI控件,比如Button.ImagView等等都继承自View类.LinearLayout.FrameLayout等布局管理器的直接父类是ViewGroup,而ViewGroup也有View类派生.总的来说,View是对UI控件的抽象,它代表了屏幕上的一个矩形区域.通

Android中关于View滑动的实现你应该知道的

滑动作为Android中最基础的特效之一,使用场景非常广泛.实现的方式也有多种,理解各种滑动的实现方式.清楚在开发中根据自己的实际需求,选择合理的实现方案.这篇文章从:scrollTo()/scrollBy()内容滑动|动画方式滑动|修改布局参数,三种方式来做简要的分析. 一丶scrollerTo()&&scrollBy()内容滑动 这两个方法都是View自带的滑动方法,即每个控件都可以通过调用这两个方法实现滑动.scrollBy()方法的实现本质也是调用scrollTo()方法,不同之处

【Android】自定义View —— 滑动的次数选择器

[关键词] 自定义View 次数选择器 滑动 [问题] 实现一个可滑动的次数选择器: [效果图] 「原型图」 「实现图」 [分析] 对外提供简单的Change监听接口: 如果处于两者之间就需要做判断:大于一半就自动跳转到下一个,小于一半,则回到上一个: 通过Scroller及其startScroll()方法来实现回弹效果: 要灵活控制刻度的最小值和最大值,因为可能随着需求的更改,这个值很容易发生改变(即处理好对应关系): 在自定义View中只画刻度和文字,至于红色的指针和外面的透明渐变图层则可以

Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个朋友在评论中留言,希望我可以帮他将这个滑动菜单改成双向滑动的方式.当时也没想花太多时间,简单修改了一下就发给了他,结果没想到后来却有一大批的朋友都来问我要这份双向滑动菜单的代码.由于这份代码写得很不用心,我发了部分朋友之后实在不忍心继续发下去了,于是决定专门写一篇文章来介绍更好的Android双向滑

Android -- ViewPager滑动背景渐变

原理 总布局为RelativeLayout或者FrameLayout,在这里我们用的是RelativeLayout.先设置背景图片,宽度和高度都fill_parent,在设置viewpager,viewpager的背景要透明哟~这样背景图片就可以显示在页面上.对viewpager进行滑动监听,通过滑动的偏移量对当前背景进行淡出,下一个背景进行显示. 布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/an

如果写一个android桌面滑动切换屏幕的控件(二)

在viewgroup执行: public void snapToScreen(int whichScreen) { whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1)); boolean changingScreens = whichScreen != mCurrentScreen; mNextScreen = whichScreen; int mScrollX = this.getScrollX(); fin

如果写一个android桌面滑动切换屏幕的控件(三)

下面我们把这个控件内嵌到Layout中做一些动画和展示,效果图: 这个子控件可以上下移动,可以左右滑动,如果上下滑动距离大于左右滑动距离,则必须上下滑动 这样来写onTouch事件: @Override public boolean onTouchEvent(MotionEvent ev) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMov