自定义viewpager
来源:互联网 发布:sql int转date 编辑:程序博客网 时间:2024/06/10 15:56
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.animation.DecelerateInterpolator;import android.widget.LinearLayout;import android.widget.Scroller;import com.zoomy.studio.locker.utils.L;public class ScrollerLayout extends LinearLayout { private Scroller mScroller; //判定为拖动的最小移动像素数 private int mTouchSlop; //手机按下时的屏幕坐标 private float mXDown; //手机当时所处的屏幕坐标 private float mXMove; //上次触发ACTION_MOVE事件时的屏幕坐标 private float mXLastMove; //界面可滚动的左边界 private int leftBorder; //界面可滚动的右边界 private int rightBorder; //当前索引 private int targetIndex; private boolean isUp; public ScrollerLayout(Context context){ this(context,null); } public ScrollerLayout(Context context, AttributeSet attrs) { super(context, attrs); mScroller = new Scroller(context,new DecelerateInterpolator(1.2f)); ViewConfiguration configuration = ViewConfiguration.get(context); mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); setOrientation(HORIZONTAL); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View childView = getChildAt(i); measureChild(childView, widthMeasureSpec, heightMeasureSpec); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed,l,t,r,b); L.i("qgl", "ScrollerLayout onLayout change=" + changed); if (changed) {// int childCount = getChildCount();// for (int i = 0; i < childCount; i++) {// View childView = getChildAt(i);// // 水平布局// childView.layout(i * childView.getMeasuredWidth(), 0, (i + 1) * childView.getMeasuredWidth(), childView.getMeasuredHeight());// } // 初始化左右边界值 leftBorder = getChildAt(0).getLeft(); rightBorder = getChildAt(getChildCount() - 1).getRight(); scrollTo(getWidth(), 0); targetIndex = 1; } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: isUp = false; mXDown = ev.getRawX(); mXLastMove = mXDown; L.i("qgl onInterceptTouchEvent ACTION_DOWN mXDown=" + mXDown + " mXLastMove=" + mXLastMove); break; case MotionEvent.ACTION_MOVE: mXMove = ev.getRawX(); float diff = Math.abs(mXMove - mXDown); mXLastMove = mXMove; L.i("qgl onInterceptTouchEvent ACTION_MOVE mXMove=" + mXMove + " mXLastMove=" + mXLastMove + " diff=" + diff); // 当手指拖动值大于TouchSlop值时,认为应该进行滚动,拦截子控件的事件 if (diff > mTouchSlop) { L.i("qgl","ScrollerLayout 拦截了"); return true; } break; } return super.onInterceptTouchEvent(ev); } float startx = 0; float endx = 0; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: isUp = false; startx = event.getX(); L.i("qgl startx=" + startx); break; case MotionEvent.ACTION_MOVE: L.i("qgl","ScrollerLayout ACTION_MOVE onPageScrolled 执行了 position="+targetIndex); listener.onPageScrolled(targetIndex); mXMove = event.getRawX(); L.i("qgl onTouchEvent ACTION_MOVE mXMove=" + mXMove); int scrolledX = (int) (mXLastMove - mXMove); L.i("qgl onTouchEvent ACTION_MOVE scrolledX=" + scrolledX + " getScrollX()=" + getScrollX()); L.i("qgl onTouchEvent ACTION_MOVE getScrollX() + scrolledX =" + getScrollX() + scrolledX + " leftBorder=" + leftBorder); if (getScrollX() + scrolledX < leftBorder) { scrollTo(leftBorder, 0); return true; } else if (getScrollX() + getWidth() + scrolledX > rightBorder) { L.i("qgl onTouchEvent ACTION_MOVE getScrollX() + getWidth() + scrolledX =" + getScrollX() + getWidth() + scrolledX + " rightBorder=" + rightBorder); scrollTo(rightBorder - getWidth(), 0); return true; } scrollBy(scrolledX, 0); L.i("qgl onTouchEvent ACTION_MOVE scrolledX =" + scrolledX); mXLastMove = mXMove; break; case MotionEvent.ACTION_UP: endx = event.getX(); isUp = true; L.i("qgl onTouchEvent ACTION_UP mxdown=" + mXDown + " mXLastMove=" + mXLastMove); // 当手指抬起时,根据当前的滚动值来判定应该滚动到哪个子控件的界面 if(Math.abs(mXLastMove-mXDown) > getWidth() /8){ if(mXLastMove < mXDown){ targetIndex++; }else { targetIndex--; } } L.i("qgl onTouchEvent ACTION_UP targetIndex=" + targetIndex); if(targetIndex >= getChildCount()){ targetIndex = getChildCount() -1; } if(targetIndex < 0){ targetIndex = 0; } int dx = targetIndex * getWidth() - getScrollX(); L.i("qgl onTouchEvent ACTION_UP dx=" + dx); mScroller.startScroll(getScrollX(), 0, dx, 0,300); invalidate(); break; } return super.onTouchEvent(event); } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { L.i("qgl","ScrollerLayout computeScroll onPageScrolled 执行了 position="+targetIndex); listener.onPageScrolled(targetIndex); scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); invalidate(); }else { if(isUp) { L.i("qgl", "ScrollerLayout onPageSelected 执行了"); listener.onPageSelected(targetIndex); } } } private OnPageChangeListener listener; public void addOnPageChangeListener(OnPageChangeListener listener){ this.listener = listener; } public interface OnPageChangeListener{ void onPageScrolled(int position); void onPageSelected(int position); } public void setCurrentItem(int position){ scrollTo(getWidth()*position, 0); targetIndex = position; }}
1 0
- viewpager自定义
- 自定义Viewpager
- 自定义ViewPager
- 自定义viewpager
- 自定义ViewPager
- 自定义viewpager
- 自定义ViewPager
- 使用ViewPager.PageTransformer自定义ViewPager
- ViewPager自定义切换动画
- 自定义ViewPager切换动画
- 自定义ViewPager指示器
- 自定义viewpager切换动画
- ViewPager自定义指示条
- 自定义控件-ViewPager篇
- 自定义ViewPager的高度
- Android--自定义tab+viewPager
- 自定义viewpager指示器
- 自定义TabHost+Fragment+ViewPager
- 14. Longest Common Prefix
- Android简易实战教程--第三十四话《 自定义SeekBar以及里面的一些小知识》
- CSS样式初始化有什么优缺点
- fgets函数
- 头标题下划线长度可变的ViewPager
- 自定义viewpager
- 第十一条:简单理解clone
- “软件工程”到底学什么(一)
- 地理位置的定位方法
- 用链表实现一元稀疏多项式的相加
- OBS源码阅读笔记--去掉顶部menubar
- 输入一个整数,逆向输出该整数
- kubenetes 1.4安装kube-UI
- Shared memory on Linux(difference posix and systemv )