package com.zhulin.android.atools;

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; public class VerticalPager extends ViewGroup{ private Scroller mScroller;
private Context mContext;
public VerticalPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext=context;
mScroller=new Scroller(context);
// mScroller=new Scroller(mContext, new Interpolator() {
//
// @Override
// public float getInterpolation(float input) {
// return 300;
// }
// }); } @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); // int measureHeight=childView.getMeasuredHeight();
// int measureWidth=childView.getMeasuredWidth(); childView.layout(l, totalHeight, r, totalHeight+b); totalHeight+=b;
}
} private VelocityTracker mVelocityTracker; @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);
//mScroller.startScroll(0, getScrollY(), 0, deltaY);
invalidate(); mLastMotionY=(int) y;
break;
case MotionEvent.ACTION_UP:
if(mVelocityTracker!=null){
mVelocityTracker.recycle();
mVelocityTracker=null;
} if(getScrollY()<0){
mScroller.startScroll(0, -400, 0, 400);
}else if(getScrollY()>(getHeight()*(getChildCount()-1))){
View lastView=getChildAt(getChildCount()-1); mScroller.startScroll(0,lastView.getTop()+300, 0, -300);
}else{
int position=getScrollY()/getHeight();
int mod=getScrollY()%getHeight(); if(mod>getHeight()/3){
View positionView=getChildAt(position+1);
mScroller.startScroll(0, positionView.getTop()-300, 0, +300);
}else{
View positionView=getChildAt(position);
mScroller.startScroll(0, positionView.getTop()+300, 0, -300);
} }
invalidate();
break;
// case MotionEvent.ACTION_MASK:
// if(getScrollY()<0){
// mScroller.startScroll(0, 0, 0, 0);
// }else if(getScrollY()>(getHeight()*(getChildCount()-1)){
// }
// invalidate();
// break;
} return true;
} @Override
public void computeScroll() {
super.computeScroll(); if(mScroller.computeScrollOffset()){
scrollTo(0, mScroller.getCurrY());
}else{ }
} }

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.zhulin.android.atools.VerticalPager
android:id="@+id/vertyPager1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" > <TextView
android:background="@drawable/a1"
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="TextView1111" /> <TextView
android:background="@drawable/a2"
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="TextView2222" /> <TextView
android:background="@drawable/a3"
android:id="@+id/textView3"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="TextView2222" /> <TextView
android:background="@drawable/a4"
android:id="@+id/textView4"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="TextView2222" />
</com.zhulin.android.atools.VertyPager> </LinearLayout>

坚向的ViewPager,上下滑动的组件,android上下滑动 VerticalPager的更多相关文章

  1. 一个 Vue 的滑动按钮组件

    git 地址:https://github.com/SyMind/vue-sliding-button vue-better-slider 一个 Vue 的滑动按钮组件,有关滑动方面的处理借鉴 bet ...

  2. 自己开发的 vue 滑动按钮组件 vue-better-slider

    写在前面的 这个人第一次尝试开发并发布一个 vue 的组件,该组件实现了类似 ios 手机淘宝客户端 -> 消息界面中消息的滑动删除功能等,如下为该组件的文档. 一个 Vue 的滑动按钮组件,有 ...

  3. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

  4. Android 使用ViewPager结合PhotoView开源组件实现网络图片在线浏览功能

    在实际的开发中,我们市场会遇到这样的情况:点击某图片,浏览某列表(某列表详情)中的所有图片数据,当然,这些图片是可以放大和缩小的,比如我们看下百度贴吧的浏览大图的效果:  链接 这种功能,在一些app ...

  5. Qt qml pageview 左右滑动分页组件

    [先看效果] [下载]http://download.csdn.net/detail/surfsky/8516949 [调用] 分页视图 左右分页滑动列表组件 示例 PageView{ id: pv ...

  6. ViewPager+Fragment再探:和TAB滑动条一起三者结合

    Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...

  7. ViewPager禁止滑动以及它与内层滑动控件水平方向上事件冲突的解决方法

    一.上图 二.场景描写叙述 最近在做项目的时候.遇到一个怪异的需求,描写叙述例如以下: 1.ViewPager中嵌套3个View,当从View1滑动到View2时禁止ViewPager的滑动事件. 2 ...

  8. Slider( 滑动条) 组件

    本节课重点了解 EasyUI 中 Slider(滑动条)组件的使用方法,这个组件依赖于Draggable(拖动)组件. 一. 加载方式//class 加载方式<input class=" ...

  9. Fragment+ViewPager实现仿微信点击和滑动切换界面

    这是在我写的新闻App中实现的界面切换 贴出切换界面的主要代码: xml代码: <span style="font-size:14px;"> <android.s ...

  10. 第二百二十节,jQuery EasyUI,Slider(滑动条)组件

    jQuery EasyUI,Slider(滑动条)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Slider(滑动条)组件的使用方法,这个 ...

随机推荐

  1. TYVJ 1288 飘飘乎居士取能量块

    背景 9月21日,pink生日:9月22日,lina生日:9月23日,轮到到飘飘乎居士(狂欢吧,(^__^) 嘻嘻--). 描述 9月21日,今天是pink的生日,飘飘乎居士当然要去别人的领土大闹一番 ...

  2. HBase的集群搭建(1、3、5节点都适用)

    见 5 hbase-shell + hbase的java api

  3. Java基础学习(二)——对象

    类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法): 对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象. 对象=实例 对象 ...

  4. 从XMLHttpRequest中获取请求的URL

    在编写Ajax通用错误处理程序时,经常需要记录发生错误的XMLHttpRequest的请求URL.但查询文档,并未找到从XMLHttpRequest中获取请求URL的方法. 在javascript - ...

  5. Yearning + Inception SQL审核平台搭建

    Yearning 安装: 安装Nginxyum install nginx -y 按照顺序安装MySQLmysql-community-common-5.7.22-1.el6.x86_64.rpmmy ...

  6. I2C controller core之Bit controller(05)

    6 generate statemachine 1 -- port cmd_ack : out std_logic; -- command completed 4 -- architecture ty ...

  7. [Intermediate Algorithm] - Binary Agents

    题目 传入二进制字符串,翻译成英语句子并返回. 二进制字符串是以空格分隔的. 提示 String.charCodeAt() String.fromCharCode() 测试用例 binaryAgent ...

  8. Windows Live Writer 历史Blog修改的功能

    其实 WLW 有历史Blog修改的功能,我只是一直没有找到,就在打开“最近发布的日志”里面, 位于屏幕的右侧“打开”列表下. 最近发现记忆力越来越差了,BLOG看来是必须的了.

  9. python 生成测试报告并发送邮件

    前言: 使用unittest编写自动化测试脚本,执行脚本后可以很方便看到测试用例的执行情况. 但如果想向领导汇报工作,就需要提供更直观的测试报告. 思路: 使用unittest编写测试用例,HTMLT ...

  10. 平衡二叉树(Self-balancing Binary Search Tree)

    Date: 2019-04-11 18:49:18 AVL树的基本操作 //存储结构 struct node { int data; int height; //记录当前子树的高度(叶子->根) ...