




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、仿百度壁纸客户端(三)首页单向,双向事件冲突处理,壁纸列表的实现一.ScrollView和ViewPager滑动事件冲突的解决办法我们仔细想想,我们的主页架构,首先他是上下滑动的,所以这样要一个ScrollView,然后就是轮播图和其他内容了,这样的话,上下滑动有事件,轮播图也有事件,我们先看下xml的实现原理home_fragment_xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=" android:layout_width=&q
2、uot;match_parent" android:layout_height="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent">
3、; <com.lgl.baiduwallpaper.view.VPScrollLayout android:id="+id/vp_scroll" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:l
4、ayout_below="+id/vp_scroll" android:text="其他内容" android:textSize="50dp" /> </RelativeLayout> </ScrollView></RelativeLayout>這裡很清晰的可以看出层级关系了,他事件冲突时必然的,解决办法也是很简单,就单以这个架构来讲的话,其实只要判断他是上下滑动还是左右滑动就好,如果是左右滑动,就不给ScrollView传递事件了,如果是上下滑动的话,让ScrollView自身来处理了,所以
5、我们需要重写ScrollViewDisScrollViewpackage com.lgl.baiduwallpaper.view;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.ScrollView;/* * 事件冲突解决 * Created by lgl on 16/4/3. */public class DisScrollView extends ScrollView /手指按下的开始坐标 private
6、 float startX, startY; /手指移动的移动坐标 private float currentX, currentY; /手指抬起的最后坐标 private float endX, endY; /手指按下后的移动距离 private float distanceX,distanceY; /* * 构造方法 * * param context * param attrs */ public DisScrollView(Context context, AttributeSet attrs) super(context, attrs); /* * 事件分发 * * param ev
7、 * return */ Override public boolean dispatchTouchEvent(MotionEvent ev) return super.dispatchTouchEvent(ev); /* * 事件拦截 * * param ev * return */ Override public boolean onInterceptTouchEvent(MotionEvent ev) switch (ev.getAction() /按下事件 case MotionEvent.ACTION_DOWN: /获取坐标 startX = ev.getX(); startY =
8、ev.getY(); break; /移动事件 case MotionEvent.ACTION_MOVE: /获取坐标 currentX = ev.getX(); currentY = ev.getY(); distanceX += Math.abs(currentX - startX); distanceY += Math.abs(currentY - startY); startX = currentX; startY = currentY; /判断滑动方向 if(distanceX >distanceY) /左右滑动, /不拦截事件 return false; break; /上下
9、移动自身处理 return super.onInterceptTouchEvent(ev); OK,我们运行一下关键是把逻辑处理好二.GridView实现壁纸列表1.ScrollView和GridView事件冲突我们可以看看百度壁纸的效果,我们也来实现一下我们要实现的就是下面的一个壁纸列表,这里我们就要考虑一下了,怎么去实现,实际上,不管是ScrollView还是GridView他们都是内存超出屏幕才回去执行滑动事件,这样的话,我们自定义一个GridView把高直接写好就可以了DisGridViewpackage com.lgl.baiduwallpaper.view;import andro
10、id.content.Context;import android.util.AttributeSet;import android.widget.GridView;/* * 事件冲突 * Created by lgl on 16/4/3. */public class DisGridView extends GridView /* * 事件冲突 * * param context * param attrs */ public DisGridView(Context context, AttributeSet attrs) super(context, attrs); /* * View的测
11、量,获得页面的整体尺寸 * * param widthMeasureSpec * param heightMeasureSpec */ Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) int height = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, height); 然后我们就可以写布局了home_f
12、ragment.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent"> <com.lgl.baiduwallpaper.view.DisScrollView android:id="+id/disScroolView" a
13、ndroid:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.lgl.baiduwallpaper.view.VPScrollLayout android:id="+id/vp_scroll" andr
14、oid:layout_width="match_parent" android:layout_height="wrap_content" /> <com.lgl.baiduwallpaper.view.DisGridView android:horizontalSpacing="10dp" android:verticalSpacing="10dp" android:numColumns="2" android:id="+id/gridview" android:
15、layout_width="match_parent" android:layout_height="match_parent" android:layout_below="+id/vp_scroll" /> </RelativeLayout> </com.lgl.baiduwallpaper.view.DisScrollView></RelativeLayout>现在触摸事件已经OK了2.实现壁纸列表这里我们没有借口,就使用本地的壁纸了,但是完全都是按照网络请求操作来的,这里使用的解析图片的
16、开源看是SmartImageView开源地址:既然要使用GridView,那就必须要有一个实体类和一个item吧HomeGridpackage com.lgl.baiduwallpaper.entity;/* * GridView数据实体类 * Created by lgl on 16/4/3. */public class HomeGrid /* * 当我们开发的时候,这里应该是个接口,那应该是String类型 * 我们现在模拟的是本地的图片,所以是int */ public HomeGrid() super(); public HomeGrid(String type, int img)
17、this.type = type; this.img = img; private int img; /描述 private String type; public int getImg() return img; public void setImg(int img) this.img = img; public String getType() return type; public void setType(String type) this.type = type; Override public String toString() return "HomeGrid"
18、; + "img=" + img + ", type='" + type + ''' + '' grid_item.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="200dp" andro
19、id:orientation="vertical"> <com.loopj.android.image.SmartImageView android:id="+id/mySmartImageView" android:layout_width="wrap_content" android:layout_height="match_parent" /> <TextView android:id="+id/tv_nice" android:layout_width="
20、;match_parent" android:layout_height="40dp" android:layout_alignParentBottom="true" android:alpha="0.3" android:background="#000" android:gravity="left|center_vertical" android:paddingLeft="15dp" android:textColor="#fff" andr
21、oid:textSize="16sp" /></RelativeLayout>然后我们回到HomeFragment中,我们定义一个方法initGridData /* * 初始化GridView的数据 */ private void initGridData() for (int i = 0; i < 10; i+) HomeGrid grid = new HomeGrid(); grid.setImg(R.drawable.nice); grid.setType("美女"); gridData.add(grid); 现在可以定义一
22、个adapter了 /* * GridView的adapter */ private class GridViewAdapter extends BaseAdapter private Context context; private LayoutInflater inflater; /* * 构造方法 * * param context */ public GridViewAdapter(Context context) this.context = context; inflater = (LayoutInflater) context.getSystemService(Context.L
23、AYOUT_INFLATER_SERVICE); Override public int getCount() return gridData.size(); Override public Object getItem(int position) return gridData.get(position); Override public long getItemId(int position) return position; Override public View getView(int position, View convertView, ViewGroup parent) Vie
24、wHolder viewHolder; /第一次加载 if (convertView = null) convertView = inflater.inflate(R.layout.grid_item, null); viewHolder = new ViewHolder(); viewHolder.img = (SmartImageView) convertView.findViewById(R.id.mySmartImageView); viewHolder.tv = (TextView) convertView.findViewById(R.id.tv_nice); convertVie
25、w.setTag(viewHolder); else viewHolder = (ViewHolder) convertView.getTag(); / viewHolder.img.setImageResource(gridData.get(position).getImg(); viewHolder.img.setBackgroundResource(gridData.get(position).getImg(); viewHolder.tv.setText(gridData.get(position).getType(); /动态设置高度 convertView.setLayoutPam
26、s(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,300); return convertView; private static class ViewHolder private SmartImageView img; private TextView tv;但是还是有一些细节需要处理的,比图scroolview一进来需要回滚到第一行/设置每次进入现最前面disScroolView.smoothScrollTo(0,0);看代码应该就能看的很清晰了吧,我们来演示一下有一点小粗糙,这就需要各位自己去完善了三
27、.意见反馈我们滑动到最后会发现,有一个意见反馈,我们去实现它在这里我们先不做跳转,先只是十点他的点击效果吧,也是相当点击简单,我们只要在DisGridView加上一个布局 <RelativeLayout android:clickable="true" android:background="drawable/bottom_select" android:layout_below="+id/gridview" android:layout_width="match_parent" android:layout
28、_height="wrap_content"> <LinearLayout android:layout_centerInParent="true" android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:src="drawable/image_more_icon_feedback&q
29、uot; android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_marginLeft="5dp" android:text="意见反馈" android:textSize="18sp" android:layout_width="wrap_content" android:layout_height="wra
30、p_content" /> </LinearLayout> </RelativeLayout>bottom_select.xml<?xml version="1.0" encoding="utf-8"?><selector xmlns:android=" <item android:drawable="drawable/image_more_subitems_bottom_selected" android:state_enabled="true&qu
31、ot; android:state_pressed="true"></item> <item android:drawable="drawable/image_more_subitems_bottom_selected" android:state_pressed="true"></item> <item android:state_pressed="false" android:drawable="drawable/image_more_subitems_
32、bottom"></item></selector>HomeFragmentpackage com.lgl.baiduwallpaper.fragment;import android.content.Context;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.view.La
33、youtInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.BaseAdapter;import android.widget.TextView;import com.lgl.baiduwallpaper.R;import com.lgl.baiduwallpaper.entity.HomeGrid;import com.lgl.baiduwallpaper.view.DisGridView;import c
34、om.lgl.baiduwallpaper.view.DisScrollView;import com.lgl.baiduwallpaper.view.VPScrollLayout;import com.loopj.android.image.SmartImageView;import java.util.ArrayList;/* * 主页 * Created by lgl on 16/3/31. */public class HomeFragment extends Fragment private VPScrollLayout vpScroll; private ViewPager myV
35、iewPager; private ArrayList<View> bitmap = new ArrayList<View>(); private DisGridView mGridView; private ArrayList<HomeGrid> gridData = new ArrayList<HomeGrid>(); private DisScrollView disScroolView; Override public View onCreateView(LayoutInflater inflater, ViewGroup contain
36、er, Bundle savedInstanceState) View view = inflater.inflate(R.layout.home_fragment, container, false); findView(view); return view; Override public void onActivityCreated(Bundle savedInstanceState) super.onActivityCreated(savedInstanceState); init(); /* * 初始化 */ private void init() initVPData(); ini
37、tGridData(); myViewPager.setAdapter(new MyAdapter(); /设置几秒轮播 vpScroll.setPagerFromTime(1000); /设置adapter mGridView.setAdapter(new GridViewAdapter(getActivity(); /设置每次进入现最前面 disScroolView.smoothScrollTo(0,0); /* * 初始化GridView的数据 */ private void initGridData() for (int i = 0; i < 10; i+) HomeGrid g
38、rid = new HomeGrid(); grid.setImg(R.drawable.nice); grid.setType("美女"); gridData.add(grid); /* * 初始化图片 */ private void initVPData() LayoutInflater inflater1 = getActivity().getLayoutInflater(); View view1 = inflater1.inflate(R.layout.vp_seroll_item, null); view1.findViewById(R.id.vpImg).se
39、tBackgroundResource(R.mipmap.img1); bitmap.add(view1); LayoutInflater inflater2 = getActivity().getLayoutInflater(); View view2 = inflater2.inflate(R.layout.vp_seroll_item, null); view2.findViewById(R.id.vpImg).setBackgroundResource(R.mipmap.img2); bitmap.add(view2); LayoutInflater inflater3 = getAc
40、tivity().getLayoutInflater(); View view3 = inflater3.inflate(R.layout.vp_seroll_item, null); view3.findViewById(R.id.vpImg).setBackgroundResource(R.mipmap.img3); bitmap.add(view3); LayoutInflater inflater4 = getActivity().getLayoutInflater(); View view4 = inflater4.inflate(R.layout.vp_seroll_item, n
41、ull); view4.findViewById(R.id.vpImg).setBackgroundResource(R.mipmap.img4); bitmap.add(view4); /* * 绑定 * * param view */ private void findView(View view) vpScroll = (VPScrollLayout) view.findViewById(R.id.vp_scroll); /直接拿到 myViewPager = vpScroll.getViewPager(); mGridView = (DisGridView) view.findView
42、ById(R.id.gridview); disScroolView = (DisScrollView) view.findViewById(R.id.disScroolView); /* * adapter */ private class MyAdapter extends PagerAdapter Override public int getCount() return bitmap.size(); Override public boolean isViewFromObject(View view, Object object) return view = object; Overr
43、ide public void destroyItem(ViewGroup container, int position, Object object) / super.destroyItem(container, position, object); /删除 (ViewPager) container).removeView(bitmap.get(position); Override public Object instantiateItem(ViewGroup container, int position) (ViewPager) container).addView(bitmap.get(position); return b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年安徽省宿州市医疗三严三基理论考试题库及答案
- 2025年药品注册审评员考核试题及答案
- 摊破浣溪沙李清照课件
- 摄影姿态基础知识培训课件
- 数据技术考试题及答案
- 2025设备租赁合同纠纷案
- 2025年春季部编版初中数学教学设计八年级下册第1课时 变量
- 2025关于中国农业银行购车贷款合同书范本
- 2025市区形象设计店合伙经营合同示例
- 搪瓷行业知识培训总结课件
- (2025年标准)强奸私了协议书
- 2025至2030中国污泥处理市场销售模式与竞争格局分析报告
- 2025年电梯安全管理员试题及答案
- 2025年赛码考试题库
- 二零二五年度抖音短视频内容创作者经纪合作协议书下载
- 水库蓝线管理办法
- 【仲量联行】2024年重庆商业地产市场报告
- 离婚协议书正规打印电子版(2025年版)
- 《 大学生军事理论教程》全套教学课件
- 外科学肺部疾病教案(共18页)
- 电鱼机的相关知识与各级电路的电路图
评论
0/150
提交评论