Android 实现纵向浏览的ViewPager
来源:互联网 发布:百胜yum统一认证平台 编辑:程序博客网 时间:2024/06/03 20:05
要实现自定义ViewPager,就要自己重写ScollerView,写一个继承ViewGroup的自定义控件。
import android.content.Context;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.GestureDetector.OnGestureListener;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.Scroller;public class MyScrollView extends ViewGroup {//解析手势的工具private GestureDetector detector;//这是一个用于计算private Scroller myScoller;//记录down事件时的Y坐标private int startY;//记录当前的id值private int currentId;private Context context;//记录是否是快速滑动private boolean isFling;//重写构造方法public MyScrollView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubthis.context = context;initView();}private void initView() {// TODO Auto-generated method stubmyScoller = new Scroller(context);detector = new GestureDetector(new OnGestureListener() {@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}//滑动事件@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {// TODO Auto-generated method stubscrollBy(0, (int) distanceY);return false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}//快速滑动事件@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {isFling = true;if (velocityY < 0 && currentId > 0) {currentId--;} else if (velocityY > 0 && currentId < getChildCount() - 1) {currentId++;}moveToDest(currentId);return false;}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}});}//对子View进行布局@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// TODO Auto-generated method stubfor (int i = 0; i < getChildCount(); i++) {View v = getChildAt(i);v.layout(0, -getHeight() * i, getWidth(), getHeight() * (1 - i));}}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubdetector.onTouchEvent(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:startY = (int) event.getY();break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP://UP事件发生时,先判断是否是快速滑动,若是快速滑动,则GestureDetector会去处理if (!isFling) {//若不是快速滑动,则判断滑动到了哪里,向上滑动,或向下滑动int disY = (int) (event.getY() - startY);if (disY > getHeight() / 2) {currentId++;} else if (disY < -getHeight() / 2) {currentId--;}moveToDest(currentId);}break;}return true;}/** * 滑动到目标ID的方法 * @param id */private void moveToDest(int id) {// TODO Auto-generated method stubid = id >= 0 ? id : 0;id = id < getChildCount() ? id : (getChildCount() - 1);int disY = -getScrollY() - id * getHeight();//给 myScoller设置初始坐标和目标坐标myScoller.startScroll(0, getScrollY(), 0, disY);currentId = id;invalidate();}/** * ViewGroup调用invalidate()方法时,会调用该方法 */@Overridepublic void computeScroll() {// myScoller会固定时间计算当前位置if (myScoller.computeScrollOffset()) {scrollTo(0, myScoller.getCurrY());//invalidate方法会重复调用computeScroll方法,直到到达myScoller的目标坐标为止invalidate();}super.computeScroll();}}
然后将需要添加的视图利用addView方法,添加到MyScollerView中就可以了。
0 0
- Android 实现纵向浏览的ViewPager
- 自定义ViewGroup实现纵向滑动切换的ViewPager
- ViewPager与TabLayout纵向实现效果
- Android ViewPager 垂直滑动 纵向滑动 VerticalViewPager
- Android ViewPager 垂直滑动 纵向滑动 VerticalViewPager
- Viewpager:实现android初次登陆浏览应用界面效果
- Android利用ViewPager实现图片浏览,解决内存问题
- DirectionalViewPager支持横向和纵向的ViewPager
- DirectionalViewPager支持横向和纵向的ViewPager
- DirectionalViewPager支持横向和纵向的ViewPager
- 纵向跑马灯的实现
- Android-Viewpager+fragment的实现
- 关于Android ViewPager的实现
- android的ViewPager+FragmentPagerAdapter实现
- 基于ViewPager实现大量图片浏览功能
- 基于ViewPager实现大量图片浏览功能
- android ViewPager 图片浏览和保存图片
- Android 使用ViewPager结合PhotoView开源组件实现网络图片在线浏览功能
- Unity协程(Coroutine)原理深入剖析
- Linux内核中kfifo使用
- ligerUI的layout的问题
- 平衡二叉树算法详解
- Struts2(二)局部与全局类型转换器
- Android 实现纵向浏览的ViewPager
- PG学习记录
- 简单Liunx线程池
- 删除排序数组中的重复数字
- Centos7 Lnmp的数据库目录修改
- CentOS 6.4下编译安装MySQL 5.6.14
- XML包使用
- 八皇后问题python实现
- EA(Enterprise Architect)使用心得