Android 实现纵向浏览的ViewPager
2015-06-17 18:04
399 查看
要实现自定义ViewPager,就要自己重写ScollerView,写一个继承ViewGroup的自定义控件。
然后将需要添加的视图利用addView方法,添加到MyScollerView中就可以了。
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 stub this.context = context; initView(); } private void initView() { // TODO Auto-generated method stub myScoller = new Scroller(context); detector = new GestureDetector(new OnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } //滑动事件 @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub scrollBy(0, (int) distanceY); return false; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } //快速滑动事件 @Override public 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; } @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } }); } //对子View进行布局 @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub for (int i = 0; i < getChildCount(); i++) { View v = getChildAt(i); v.layout(0, -getHeight() * i, getWidth(), getHeight() * (1 - i)); } } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub detector.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 stub id = 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()方法时,会调用该方法 */ @Override public void computeScroll() { // myScoller会固定时间计算当前位置 if (myScoller.computeScrollOffset()) { scrollTo(0, myScoller.getCurrY()); //invalidate方法会重复调用computeScroll方法,直到到达myScoller的目标坐标为止 invalidate(); } super.computeScroll(); } }
然后将需要添加的视图利用addView方法,添加到MyScollerView中就可以了。
相关文章推荐
- Android开发系列(十一):对手机通讯录的读取、添加、删除、查找
- Android ActionBar上不显示icon的问题
- android非法字符的判定、表情符号的判定
- Android 事件冒泡及捕获
- Android数据篇
- Android入门——电话拨号器和4种点击事件
- Android LaunchMode属性简介
- Android学习4、Android该Adapter
- Android学习笔记——ListView
- Android: 阻止ScrollView随着数据加载自动滚动
- Android 双击返回键退出应用
- 基于XMPP协议的Android即时通信系
- IntelliJ IDEA /Android Studio显示文档
- IntelliJ IDEA/ Android Studio 显示行号方法
- Android学习笔记——ProgressBarHandler
- android加ShortCut之历险记
- Android Binder驱动程序
- Android 基础
- Android调试笔记
- Android学习笔记——ProgressBar