当前位置: 首页 > 后端技术 > Java

Android中的自定义View(二)

时间:2023-04-02 10:16:38 Java

PS:本文为转载文章,原文可读性会更好,文末有原文链接ps:本篇demo文章是用AndroidStudio工具开发的。这里在Android中自定义View(一)一文的基础上,继续写一个自定义View的案例。这里的自定义ViewGroup是直接继承自ViewGroup的。我们写一个像ViewPager这样的自定义ViewGroup,可以让它左右滑动。(1)新建一个Activity,名称为DemoActivity;publicclassDemoActivityextendsActivity{privateMyViewPagermViewPager;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_demo);初始化视图();}privatevoidinitView(){LayoutInflaterinflater=getLayoutInflater();mViewPager=(MyViewPager)findViewById(R.id.viewPager);//1、finalintscreenWidth=getScreenMetrics(this).widthPixels;for(inti=0;i<4;i++){查看布局=inflater.inflate(R.layout.content_layout,mViewPager,false);layout.getLayoutParams().width=screenWidth;TextViewtextView=(TextView)layout.findViewById(R.id.tv);textView.setText("第"+(i+1)+"页面");//2、mViewPager.addView(layout);}}公共DisplayMetricsgetScreenMetrics(Contextcontext){WindowManagerwm=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);DisplayMetricsdm=newDisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);返回DM;手机屏幕的宽度;注2表示将创建的View添加到MyViewPager(2)新建一个布局文件activity_demo.xml;(3)新建一个类MyViewPager并继承于ViewGroup;publicclassMyViewPagerextendsViewGroup{privateintmChildrenSize;私人诠释mChildWidth;私有intmChildIndex;私人intmLastX=0;私人intmLastY=0;私人intmLastXIntercept=0;私人intmLastYIntercept=0;私有滚动器mScroller;私有速度跟踪器mVelocityTracker;公共MyViewPager(上下文上下文){超级(上下文);在里面();}publicMyViewPager(Contextcontext,AttributeSetattrs){super(context,attrs);在里面();}publicMyViewPager(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);在里面();}privatevoidinit(){if(mScroller==null){mScroller=newScroller(getContext());mVelocityTracker=VelocityTracker.obtain();}}//3、@OverridepublicbooleanonInterceptTouchEvent(MotionEventevent){booleanintercepted=false;intx=(int)event.getX();inty=(int)event.getY();switch(event.getAction()){caseMotionEvent.ACTION_DOWN:{intercepted=false;if(!mScroller.isFinished()){mScroller.abortAnimation();//4、截取=true;}休息;}caseMotionEvent.ACTION_MOVE:{intdeltaX=x-mLastXIntercept;intdeltaY=y-mLastYIntercept;if(Math.abs(deltaX)>Math.abs(deltaY)){//5、intercepted=true;}else{拦截=false;}休息;}caseMotionEvent.ACTION_UP:{intercepted=false;休息;默认值:中断;}mLastX=x;mLastY=y;mLastXIntercept=x;mLastYIntercept=y;返回拦截;}@OverridepublicbooleanonTouchEvent(MotionEventevent){mVelocityTracker.addMovement(event);intx=(int)event.getX();inty=(int)event.getY();switch(event.getAction()){caseMotionEvent.ACTION_DOWN:{if(!mScroller.isFinished()){mScroller.abortAnimation();}休息;}caseMotionEvent.ACTION_MOVE:{intdeltaX=x-mLastX;intdeltaY=y-mLastY;滚动(-deltaX,0);休息;}caseMotionEvent.ACTION_UP:{intscrollX=getScrollX();//6、mVelocityTracker.computeCurrentVelocity(1000);//7、floatxVelocity=mVelocityTracker.getXVelocity();如果(Math.abs(xVelocity)>=50){mChildIndex=xVelocity>0?mChildIndex-1:mChildIndex+1;}else{mChildIndex=(scrollX+mChildWidth/2)/mChildWidth;}mChildIndex=Math.max(0,Math.min(mChildIndex,mChildrenSize-1));//8、intdx=mChildIndexmChildWidth-scrollX;smoothScrollBy(dx,0);mVelocityTracker.clear();休息;}默认值:中断;}mLastX=x;mLastY=y;返回真;}@OverrideprotectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){super.onMeasure(widthMeasureSpec,heightMeasureSpec);intmeasuredWidth=0;intmeasuredHeight=0;最终intchildCount=getChildCount();measureChildren(widthMeasureSpec,heightMeasureSpec);intmaxChildWidth=0;intmaxChildHeight=0;//14、for(inti=0;imaxChildHeight){maxChildHeight=child.getMeasuredHeight();}if(child.getMeasuredWidth()>maxChildWidth){maxChildWidth=child.getMeasuredWidth();}}intwidthSpaceSize=MeasureSpec.getSize(widthMeasureSpec);intwidthSpecMode=MeasureSpec.getMode(widthMeasureSpec);intheightSpaceSize=MeasureSpec.getSize(heightMeasureSpec);intheightSpecMode=MeasureSpec.getMode(heightMeasureSpec);如果(childCount==0){setMeasuredDimension(0,0);}elseif(widthSpecMode==MeasureSpec.AT_MOST&&heightSpecMode==MeasureSpec.AT_MOST){measuredWidth=maxChildWidthchildCount;measuredHeight=maxChildHeight;//15、setMeasuredDimension(measuredWidth,measuredHeight);}elseif(heightSpecMode==MeasureSpec.AT_MOST){finalViewchildView=getChildAt(0);measuredHeight=maxChildHeight;//16、setMeasuredDimension(widthSpaceSize,childView.getMeasuredHeight());}elseif(widthSpecMode==MeasureSpec.AT_MOST){measuredWidth=maxChildWidth*childCount;//17、setMeasuredDimension(测量宽度、高度空间大小);}}@OverrideprotectedvoidonLayout(booleanchanged,intl,intt,intr,intb){intchildLeft=0;最终intchildCount=getChildCount();mChildrenSize=childCount;for(inti=0;i

最新推荐
猜你喜欢