您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 仿百度壁纸客户端(三)首页单向,双向事件冲突处理,壁纸列表的实现
仿百度壁纸客户端(三)——首页单向,双向事件冲突处理,壁纸列表的实现一.ScrollView和ViewPager滑动事件冲突的解决办法我们仔细想想,我们的主页架构,首先他是上下滑动的,所以这样要一个ScrollView,然后就是轮播图和其他内容了,这样的话,上下滑动有事件,轮播图也有事件,我们先看下xml的实现原理home_fragment_xml?xmlversion=1.0encoding=utf-8?RelativeLayoutxmlns:android=:layout_width=match_parentandroid:layout_height=match_parentScrollViewandroid:layout_width=match_parentandroid:layout_height=match_parentRelativeLayoutandroid:layout_width=match_parentandroid:layout_height=match_parentcom.lgl.baiduwallpaper.view.VPScrollLayoutandroid:id=@+id/vp_scrollandroid:layout_width=match_parentandroid:layout_height=wrap_content/TextViewandroid:layout_width=match_parentandroid:layout_height=wrap_contentandroid:layout_below=@+id/vp_scrollandroid:text=其他内容android:textSize=50dp//RelativeLayout/ScrollView/RelativeLayout這裡很清晰的可以看出层级关系了,他事件冲突时必然的,解决办法也是很简单,就单以这个架构来讲的话,其实只要判断他是上下滑动还是左右滑动就好,如果是左右滑动,就不给ScrollView传递事件了,如果是上下滑动的话,让ScrollView自身来处理了,所以我们需要重写ScrollViewDisScrollViewpackagecom.lgl.baiduwallpaper.view;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.view.MotionEvent;importandroid.widget.ScrollView;/***事件冲突解决*Createdbylglon16/4/3.*/publicclassDisScrollViewextendsScrollView{//手指按下的开始坐标privatefloatstartX,startY;//手指移动的移动坐标privatefloatcurrentX,currentY;//手指抬起的最后坐标privatefloatendX,endY;//手指按下后的移动距离privatefloatdistanceX,distanceY;/***构造方法**@paramcontext*@paramattrs*/publicDisScrollView(Contextcontext,AttributeSetattrs){super(context,attrs);}/***事件分发**@paramev*@return*/@OverridepublicbooleandispatchTouchEvent(MotionEventev){returnsuper.dispatchTouchEvent(ev);}/***事件拦截**@paramev*@return*/@OverridepublicbooleanonInterceptTouchEvent(MotionEventev){switch(ev.getAction()){//按下事件caseMotionEvent.ACTION_DOWN://获取坐标startX=ev.getX();startY=ev.getY();break;//移动事件caseMotionEvent.ACTION_MOVE://获取坐标currentX=ev.getX();currentY=ev.getY();distanceX+=Math.abs(currentX-startX);distanceY+=Math.abs(currentY-startY);startX=currentX;startY=currentY;//判断滑动方向if(distanceXdistanceY){//左右滑动,//不拦截事件returnfalse;}break;}//上下移动自身处理returnsuper.onInterceptTouchEvent(ev);}}OK,我们运行一下关键是把逻辑处理好二.GridView实现壁纸列表1.ScrollView和GridView事件冲突我们可以看看百度壁纸的效果,我们也来实现一下我们要实现的就是下面的一个壁纸列表,这里我们就要考虑一下了,怎么去实现,实际上,不管是ScrollView还是GridView他们都是内存超出屏幕才回去执行滑动事件,这样的话,我们自定义一个GridView把高直接写好就可以了DisGridViewpackagecom.lgl.baiduwallpaper.view;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.widget.GridView;/***事件冲突*Createdbylglon16/4/3.*/publicclassDisGridViewextendsGridView{/***事件冲突**@paramcontext*@paramattrs*/publicDisGridView(Contextcontext,AttributeSetattrs){super(context,attrs);}/***View的测量,获得页面的整体尺寸**@paramwidthMeasureSpec*@paramheightMeasureSpec*/@OverrideprotectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){intheight=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec,height);}}然后我们就可以写布局了home_fragment.xml?xmlversion=1.0encoding=utf-8?RelativeLayoutxmlns:android=:layout_width=match_parentandroid:layout_height=match_parentcom.lgl.baiduwallpaper.view.DisScrollViewandroid:id=@+id/disScroolViewandroid:layout_width=match_parentandroid:layout_height=match_parentRelativeLayoutandroid:layout_width=match_parentandroid:layout_height=match_parentcom.lgl.baiduwallpaper.view.VPScrollLayoutandroid:id=@+id/vp_scrollandroid:layout_width=match_parentandroid:layout_height=wrap_content/com.lgl.baiduwallpaper.view.DisGridViewandroid:horizontalSpacing=10dpandroid:verticalSpacing=10dpandroid:numColumns=2android:id=@+id/gridviewandroid:layout_width=match_parentandroid:layout_height=match_parentandroid:layout_below=@+id/vp_scroll//RelativeLayout/com.lgl.baiduwallpaper.view.DisScrollView/RelativeLayout现在触摸事件已经OK了2.实现壁纸列表这里我们没有借口,就使用本地的壁纸了,但是完全都是按照网络请求操作来的,这里使用的解析图片的开源看是SmartImageView开源地址:既然要使用GridView,那就必须要有一个实体类和一个item吧HomeGridpackagecom.lgl.baiduwallpaper.entity;/***GridView数据实体类*Createdbylglon16/4/3.*/publicclassHomeGrid{/***当我们开发的时候,这里应该是个接口,那应该是String类型*我们现在模拟的是本地的图片,所以是int*/publicHomeGrid(){super();}publicHomeGrid(Stringtype,intimg){this.type=type;this.img=img;}privateintimg;//描述privateStringtype;publicintgetImg(){returnimg;}publicvoidsetImg(intimg){this.img=img;}publicStringgetType(){returntype;}publicvoidsetType(Stringtype){this.type=type;}@OverridepublicStringtoString(){returnHomeGrid{+img=+img+,type='+type+'\''+'}';}}grid_item.xml?xmlversion=1.0encoding=utf-8?RelativeLayoutxmlns:android=:layout_width=match_parentandroid:layout_height=200dpandroid:orientation=verticalcom.loopj.android.image.SmartImageViewandroid:id=@+id/mySmartImageViewandroid:layout_width=wrap_contentandroid:layout_height=match_parent/TextViewandroid:id=@+id/tv_niceandroid:layout_width=match_parentandroid:layout_height=40dpandroid:layout_alignParentBottom=trueandroid:alpha=0.3android:background=#000android:gravity=left|cent
本文标题:仿百度壁纸客户端(三)首页单向,双向事件冲突处理,壁纸列表的实现
链接地址:https://www.777doc.com/doc-2716038 .html