android群英传读书笔记---自定义ViewGroup
来源:互联网 发布:日久军警装备淘宝店 编辑:程序博客网 时间:2024/04/29 19:03
自定义ViewGroup
这个还真是第一次接触,以前从来没写过这种控件,正好借着这本书,好好学习一番。
案例功能:实现scrollview所具有的上下滑动功能,并增加粘性效果
1. 首先实现类似Scrollview的功能
/** * * 使用遍历的方式通知子view进行自测 * * */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int count = getChildCount(); for (int i = 0; i < count; i++) { View childView = getChildAt(i); measureChild(childView, widthMeasureSpec, heightMeasureSpec); } }
2. 放置子view
/** * 每个view独占一屏 放置view的位置 * */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // 设置ViewGroup的高度 mScreenHeight = getScreenHeight(); int childcount = getChildCount(); MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams(); mlp.height = childcount * mScreenHeight; setLayoutParams(mlp); for (int i = 0; i < childcount; i++) { View view = getChildAt(i); if (view.getVisibility() != View.GONE) { view.layout(l, i * mScreenHeight, r, (i + 1) * mScreenHeight); } } } /** * 计算屏幕高度 * * @return */ private int getScreenHeight() { WindowManager manager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); manager.getDefaultDisplay().getMetrics(dm); return dm.heightPixels; }
3.响应滑动事件
3.1 重写触摸事件
@Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); int y = (int) event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: mLastY = y; // 记录触摸起点 mStart = getScrollY(); break; case MotionEvent.ACTION_MOVE: if (!mScroller.isFinished()) { mScroller.abortAnimation(); } int dy = mLastY - y; //View移动到上边沿 if (getScrollY() < 0) { dy = 0; } //view移动到下边沿 if (getScrollY() > getHeight() - mScreenHeight) { dy = 0; } Log.e("mess", mScreenHeight+"-----height="+getHeight()+"-----------view="+(getHeight()-mScreenHeight)); scrollBy(0, dy); mLastY = y; break; case MotionEvent.ACTION_UP: // 记录触摸终点 mEnd = getScrollY(); int dScrollY = mEnd - mStart; Log.e("mess", "---dscrollY="+dScrollY); if (dScrollY > 0) {// 上滑 if (dScrollY < mScreenHeight / 3) {// 回彈效果 mScroller.startScroll(0, getScrollY(), 0, -dScrollY); } else {// 滑到下一个view mScroller.startScroll(0, getScrollY(), 0, mScreenHeight - dScrollY); } } else {// 下滑 if (-dScrollY < mScreenHeight / 3) {// 回彈 mScroller.startScroll(0, getScrollY(), 0, -dScrollY); } else { mScroller.startScroll(0, getScrollY(), 0, -mScreenHeight - dScrollY); } } break; } //不要忘了,忘了这个有点坑了就 postInvalidate(); return true; }
3.2 实现滚动
@Override public void computeScroll() { super.computeScroll(); if (mScroller.computeScrollOffset()) { scrollTo(0, mScroller.getCurrY()); postInvalidate(); } }
3.3 效果如下图
总结:自定义viewgroup总算是学习到了,往后就是需要在工作中多加练习了,原理总算是有点明了,非常感谢大神写的书,哈哈~~~
0 0
- android群英传读书笔记---自定义ViewGroup
- 自定义ViewGroup(Android群英传)
- Android群英传读书笔记---自定义控件(-)
- 《Android群英传》笔记6——自定义ViewGroup
- Android 群英传读书笔记
- 《Android群英传》读书笔记
- 《Android群英传》读书笔记
- 《Android群英传》---读书笔记1
- 《Android群英传》---读书笔记2
- 《Android群英传》---读书笔记3
- 《Android群英传》---读书笔记4
- 《Android群英传》---读书笔记5
- 《Android群英传》---读书笔记6
- 《Android群英传》---读书笔记7
- 《Android群英传》---读书笔记8
- 《Android群英传》---读书笔记9
- Android群英传读书笔记1
- 3.Android群英传读书笔记-控件架构与自定义控件
- python备忘
- opencv3寻找最小包围矩形-minAreaRect函数
- Oracle 11g R2 安装时提示找不到em.ear
- YII 获取系统级请求参数的常用方法
- 黑马程序员 面向对象(上)
- android群英传读书笔记---自定义ViewGroup
- 学习规划
- Android开始中的OOM异常
- UI的创建基础
- opencv3寻找最小包围矩形在图像中的应用-滚动条
- Java中使用DOM解析XML
- Qt学习之路(24): QPainter
- UVA 10341 Solve It
- Hadoop(七)——子项目Hive