Android自定义ViewGroup实现可滚动的横向布局(2)
上一篇文章自定义viewgroup(1)地址:https://www.nhooo.com/article/100608.htm
这里直接代码:
packagecom.example.libingyuan.horizontallistview.ScrollViewGroup; importandroid.content.Context; importandroid.util.AttributeSet; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.Scroller; /** *自定义ViewGroup *在横向布局的基础上,增加啦滚动效果,但是没有边界限制 */ publicclassScrollViewGroupextendsViewGroup{ privateScrollermScroller; privatefloatmLastMotionX=0; publicScrollViewGroup(Contextcontext){ this(context,null); } publicScrollViewGroup(Contextcontext,AttributeSetattrs){ this(context,attrs,0); } publicScrollViewGroup(Contextcontext,AttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); init(context); } privatevoidinit(Contextcontext){ mScroller=newScroller(context); } @Override publicvoidcomputeScroll(){ if(mScroller.computeScrollOffset()){ scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); postInvalidate(); } } @Override publicbooleanonTouchEvent(MotionEventevent){ //TODOAuto-generatedmethodstub intaction=event.getAction(); floatx=event.getX(); switch(action){ caseMotionEvent.ACTION_DOWN: if(!mScroller.isFinished()){ mScroller.abortAnimation(); } mLastMotionX=event.getX(); break; caseMotionEvent.ACTION_MOVE: floatdelt=mLastMotionX-x; mLastMotionX=x; scrollBy((int)delt,0); break; caseMotionEvent.ACTION_UP: invalidate(); break; default: break; } returntrue; } @Override protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){ //重新设置宽高 this.setMeasuredDimension(measureWidth(widthMeasureSpec,heightMeasureSpec),measureHeight(widthMeasureSpec,heightMeasureSpec)); } /** *测量宽度 */ privateintmeasureWidth(intwidthMeasureSpec,intheightMeasureSpec){ //宽度 intsizeWidth=MeasureSpec.getSize(widthMeasureSpec); intmodeWidth=MeasureSpec.getMode(widthMeasureSpec); //父控件的宽(wrap_content) intwidth=0; intchildCount=getChildCount(); //重新测量子view的宽度,以及最大高度 for(inti=0;i<childCount;i++){ Viewchild=getChildAt(i); measureChild(child,widthMeasureSpec,heightMeasureSpec); MarginLayoutParamslp=(MarginLayoutParams)child.getLayoutParams(); intchildWidth=child.getMeasuredWidth()+lp.leftMargin+lp.rightMargin; width+=childWidth; } returnmodeWidth==MeasureSpec.EXACTLY?sizeWidth:width; } /** *测量高度 */ privateintmeasureHeight(intwidthMeasureSpec,intheightMeasureSpec){ //高度 intsizeHeight=MeasureSpec.getSize(heightMeasureSpec); intmodeHeight=MeasureSpec.getMode(heightMeasureSpec); //父控件的高(wrap_content) intheight=0; intchildCount=getChildCount(); //重新测量子view的宽度,以及最大高度 for(inti=0;i<childCount;i++){ Viewchild=getChildAt(i); measureChild(child,widthMeasureSpec,heightMeasureSpec); MarginLayoutParamslp=(MarginLayoutParams)child.getLayoutParams(); intchildHeight=child.getMeasuredHeight()+lp.topMargin+lp.bottomMargin; height+=childHeight; } height=height/childCount; returnmodeHeight==MeasureSpec.EXACTLY?sizeHeight:height; } @Override protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){ intchildLeft=0; intchildWidth; intheight=getHeight(); intchildCount=getChildCount(); for(inti=0;i<childCount;i++){ Viewchild=getChildAt(i); MarginLayoutParamslp=(MarginLayoutParams)child.getLayoutParams(); childWidth=child.getMeasuredWidth()+lp.leftMargin+lp.rightMargin; child.layout(childLeft,0,childLeft+childWidth,height); childLeft+=childWidth; } } @Override publicLayoutParamsgenerateLayoutParams(AttributeSetattrs){ returnnewMarginLayoutParams(getContext(),attrs); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。