自定义类似于ViewPager的可上下滑动切换效果的视图
来源:互联网 发布:黑莓playbook软件下载 编辑:程序博客网 时间:2024/05/16 12:50
今天给大家分享一个使用Scroller滚动类实现的控件,我们知道,viewpager实现的是一种左右切换的效果,使用scroller+事件分发来实现viewpager本身并不是一件特别难的事,因为viewpager其内部的实现原理就是这样。为了跟大家更好地分享下scroller的用法,我实现了一个可以上下切换的效果。下面直接贴该类代码:
1.VDViewPager.class
import android.content.Context;import android.support.v4.view.ViewConfigurationCompat;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewConfiguration;import android.view.ViewGroup;import android.widget.Scroller;/** * Created by _H_JY on 2016/3/3. * instruction:A custom viewpager which srcolls to vertical direction. */public class VDViewPager extends ViewGroup{ /*滚动实例*/ private Scroller mScroller; /*判断是否滑动的最小距离*/ private int mTouchSlop; /*手指触摸到屏幕时y值*/ private float mYDown; /*手指在竖直方向上移动的距离*/ private float mYMove; /*标记最后的位置*/ private float mLastMove; /*标记上边缘*/ private int mTopBorder; /*标记下边缘*/ private int mBottomBorder; public VDViewPager(Context context) { this(context, null); } public VDViewPager(Context context, AttributeSet attrs) { this(context, attrs, 0); } public VDViewPager(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); /*初始化滚动实例*/ mScroller = new Scroller(context); /*获取最小滑动值,该值用于判断是否可滑*/ ViewConfiguration vc = ViewConfiguration.get(context); mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(vc); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int cCount = this.getChildCount(); for (int i=0;i<cCount;i++){ View childView = this.getChildAt(i); /*测量每一个子View*/ measureChild(childView,widthMeasureSpec,heightMeasureSpec); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if(changed){ int cCount = this.getChildCount(); for (int i=0;i<cCount;i++){ View childView = this.getChildAt(i); /*从上往下布局*/ childView.layout(0,i*childView.getMeasuredHeight(),childView.getMeasuredWidth(),(i+1)*childView.getMeasuredHeight()); } mTopBorder = this.getChildAt(0).getTop(); mBottomBorder = this.getChildAt(this.getChildCount()-1).getBottom(); } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: mYDown = ev.getRawY(); mLastMove = mYDown; break; case MotionEvent.ACTION_MOVE: mYMove = ev.getRawY(); int diff = (int) Math.abs(mYMove - mYDown); if(diff > mTouchSlop){ //判断是否可滑 return true; } mLastMove = mYMove; break; default: break; } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_MOVE: mYMove = event.getRawY(); int scrolledY = (int) (mLastMove - mYMove); if(this.getScrollY() + scrolledY < mTopBorder){ /*到第一个子View顶端时不给下滑*/ this.scrollTo(mTopBorder,0); return true; }else if(this.getScrollY() + scrolledY + this.getHeight() > mBottomBorder){ /*到最后一个子View底端时不给上滑*/ this.scrollTo(0,mButtomBorder - this.getHeight()); return true; } this.scrollBy(0,scrolledY); mLastMove = mYMove; break; case MotionEvent.ACTION_UP: int targetIndex = (this.getScrollY()+this.getHeight()/2)/this.getHeight(); /*得到应该滑动的距离*/ int dy = targetIndex*this.getHeight() - this.getScrollY(); /*开始滑动*/ mScroller.startScroll(0,this.getScrollY(),0,dy); invalidate(); break; default: break; } return super.onTouchEvent(event); } @Override public void computeScroll() { super.computeScroll(); /*平滑滚动*/ if(mScroller.computeScrollOffset()){ this.scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); invalidate(); } }}
上面的注释写得也比较清晰了,相信大家都能看懂。
2.布局文件(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?><g.scrolltest.view.VDViewPager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="g.scrolltest.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:text="One"/> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:text="Two"/> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:text="Three"/></g.scrolltest.view.VDViewPager>
布局文件相当简单,就三个按钮,没什么好说的额。。。
3.MainActivity.class(主Activity)
import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }}
啥都没写,更不用说。。。运行效果图就不贴了。哈哈我太懒了
0 0
- 自定义类似于ViewPager的可上下滑动切换效果的视图
- Android 自定义ViewPager的滑动切换页面效果
- 可左右上下滑动切换图片的界面
- 关于上下滑动的viewpager
- android —— 自定义控件 竖向的ViewPager,上下滑动的组件,android上下滑动 VerticalPager
- 自定义ViewGroup实现ViewPager的滑动效果
- ViewPager的滑动切换
- xSlider 可左右、上下图片切换的无缝滚动效果
- listview上下滑动与item的viewpager左右滑动时的焦点切换问题
- 强大的ViewPager多页面滑动切换以及动画效果
- 强大的ViewPager多页面滑动切换以及动画效果
- 【Android UI】案例03滑动切换效果的实现(ViewPager)
- Android ViewPager特效之水滴效果的滑动切换页面
- ViewPager实现欢迎界面的滑动切换效果
- Viewpager+Fragment去除页面切换时的滑动翻页效果
- ViewPager的切换效果
- 自定义ViewPager、HorizontalScrollView、Indicator实现可滑动的头部
- 自定义ViewGroup实现纵向滑动切换的ViewPager
- Intent的几种有关Activity启动的方式与Activity和Task的启动模式
- 关于设计WAP网站缩放的问题
- 二叉树遍历 ,前序,中序,后序, 递归版本
- iptables禁止端口和开放端口
- HTML5本地数据库详解
- 自定义类似于ViewPager的可上下滑动切换效果的视图
- iOS does not contain bitcode 报错解决
- Android studio 2.0 初级教程(一)
- 什么是JavaBean,JavaBean入门及实例
- LeetCode(38)-Count and Say
- 内核模块相关命令:lsmod,depmod,modprob,modinfo,insmod,rmmod
- CollectionView嵌套TableView。页面滑动指向不同的标题
- question_013-JAVA之Set之TreeSet
- c#将正则截取到的数据保存到实体中