本文实例讲述了Android开发实现自定义水平滚动的容器。分享给大家供大家参考,具体如下:
public class HorizontalScrollView extends ViewGroup { //手势 private GestureDetector mGestureDetector; private HorizontalScroller mScroller; private int curID; //快速滑动 private boolean isFlying; //--回调函数------------------------------------- private OnChangeListener mListener; public void setOnChangeListener(OnChangeListener listener) { if (listener != null) { mListener = listener; } } public interface OnChangeListener{ void move2dest(int curID); } public HorizontalScrollView(Context context) { this(context, null); } public HorizontalScrollView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public HorizontalScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mScroller = new HorizontalScroller(); isFlying = false; initGesture(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // 模向移动, for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); //给水平方向的每个view定位 view.layout(i * getWidth(), 0, getWidth() + i * getWidth(), getHeight()); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); view.measure(widthMeasureSpec, heightMeasureSpec); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override public boolean onTouchEvent(MotionEvent event) { mGestureDetector.onTouchEvent(event); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (!isFlying) { move2dest(); } isFlying = false; break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; default: break; } return true; } public void move2dest() { // int destID = (getScrollX() + getWidth() / 2) / getWidth(); move2dest(destID); } public void move2dest(int destID) { curID = destID; if (destID > getChildCount() - 1) { destID = getChildCount() - 1; } if (mListener != null) { mListener.move2dest(curID); } int distance = (int) (destID * getWidth() - getScrollX()); // scrollBy(distance, 0); mScroller.startScroll(getScrollX(), getScrollY(), distance, 0); invalidate(); } @Override public void computeScroll() { // 如果存在偏移,就不断刷新 if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), 0); invalidate(); } super.computeScroll(); } private void initGesture(Context context) { mGestureDetector = new GestureDetector(context, new OnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { scrollBy((int) distanceX, 0); return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { isFlying = true; if (curID > 0 && velocityX > 0) {// 表示向左移 move2dest(curID - 1); } else if (curID < getChildCount() && velocityX < 0) { move2dest(curID + 1);// 向右 } else { move2dest();// 移到原位 } return false; } @Override public boolean onDown(MotionEvent e) { return false; } }); }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机Android开发实现自定义水平滚动的容器示例
后端开发2023-05-30
Android开发自定义实时图表控件实现示例
后端开发2024-04-02
android开发教程之使用线程实现视图平滑滚动示例
后端开发2022-06-06
SpringBoot实现自定义启动器的示例详解
后端开发2023-01-12
在Android开发中使用Toast怎么实现自定义布局简单示例
后端开发2023-05-31
Android自定义SeekBar实现滑动验证且不可点击的示例
后端开发2023-06-14
咦!没有更多了?去看看其它编程学习网 内容吧