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
原创粉丝点击