仿百度壁紙客戶端(三)——首頁單向,雙向事件沖突處理,壁紙列表的實(shí)現(xiàn)_第1頁
仿百度壁紙客戶端(三)——首頁單向,雙向事件沖突處理,壁紙列表的實(shí)現(xiàn)_第2頁
仿百度壁紙客戶端(三)——首頁單向,雙向事件沖突處理,壁紙列表的實(shí)現(xiàn)_第3頁
仿百度壁紙客戶端(三)——首頁單向,雙向事件沖突處理,壁紙列表的實(shí)現(xiàn)_第4頁
仿百度壁紙客戶端(三)——首頁單向,雙向事件沖突處理,壁紙列表的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、仿百度壁紙客戶端(三)首頁單向,雙向事件沖突處理,壁紙列表的實(shí)現(xiàn)一.ScrollView和ViewPager滑動事件沖突的解決辦法我們仔細(xì)想想,我們的主頁架構(gòu),首先他是上下滑動的,所以這樣要一個ScrollView,然后就是輪播圖和其他內(nèi)容了,這樣的話,上下滑動有事件,輪播圖也有事件,我們先看下xml的實(shí)現(xiàn)原理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="其他內(nèi)容" android:textSize="50dp" /> </RelativeLayout> </ScrollView></RelativeLayout>這裡很清晰的可以看出層級關(guān)系了,他事件沖突時必然的,解決辦法也是很簡單,就單以這個架構(gòu)來講的話,其實(shí)只要判斷他是上下滑動還是左右滑動就好,如果是左右滑動,就不給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 /手指按下的開始坐標(biāo) private

6、 float startX, startY; /手指移動的移動坐標(biāo) private float currentX, currentY; /手指抬起的最后坐標(biāo) private float endX, endY; /手指按下后的移動距離 private float distanceX,distanceY; /* * 構(gòu)造方法 * * param context * param attrs */ public DisScrollView(Context context, AttributeSet attrs) super(context, attrs); /* * 事件分發(fā) * * 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: /獲取坐標(biāo) startX = ev.getX(); startY =

8、ev.getY(); break; /移動事件 case MotionEvent.ACTION_MOVE: /獲取坐標(biāo) 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,我們運(yùn)行一下關(guān)鍵是把邏輯處理好二.GridView實(shí)現(xiàn)壁紙列表1.ScrollView和GridView事件沖突我們可以看看百度壁紙的效果,我們也來實(shí)現(xiàn)一下我們要實(shí)現(xiàn)的就是下面的一個壁紙列表,這里我們就要考慮一下了,怎么去實(shí)現(xiàn),實(shí)際上,不管是ScrollView還是GridView他們都是內(nèi)存超出屏幕才回去執(zhí)行滑動事件,這樣的話,我們自定義一個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>現(xiàn)在觸摸事件已經(jīng)OK了2.實(shí)現(xiàn)壁紙列表這里我們沒有借口,就使用本地的壁紙了,但是完全都是按照網(wǎng)絡(luò)請求操作來的,這里使用的解析圖片的

16、開源看是SmartImageView開源地址:既然要使用GridView,那就必須要有一個實(shí)體類和一個item吧HomeGridpackage com.lgl.baiduwallpaper.entity;/* * GridView數(shù)據(jù)實(shí)體類 * Created by lgl on 16/4/3. */public class HomeGrid /* * 當(dāng)我們開發(fā)的時候,這里應(yīng)該是個接口,那應(yīng)該是String類型 * 我們現(xiàn)在模擬的是本地的圖片,所以是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的數(shù)據(jù) */ private void initGridData() for (int i = 0; i < 10; i+) HomeGrid grid = new HomeGrid(); grid.setImg(R.drawable.nice); grid.setType("美女"); gridData.add(grid); 現(xiàn)在可以定義一

22、個adapter了 /* * GridView的adapter */ private class GridViewAdapter extends BaseAdapter private Context context; private LayoutInflater inflater; /* * 構(gòu)造方法 * * 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(); /動態(tài)設(shè)置高度 convertView.setLayoutPam

26、s(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,300); return convertView; private static class ViewHolder private SmartImageView img; private TextView tv;但是還是有一些細(xì)節(jié)需要處理的,比圖scroolview一進(jìn)來需要回滾到第一行/設(shè)置每次進(jìn)入現(xiàn)最前面disScroolView.smoothScrollTo(0,0);看代碼應(yīng)該就能看的很清晰了吧,我們來演示一下有一點(diǎn)小粗糙,這就需要各位自己去完善了三

27、.意見反饋我們滑動到最后會發(fā)現(xiàn),有一個意見反饋,我們?nèi)?shí)現(xiàn)它在這里我們先不做跳轉(zhuǎn),先只是十點(diǎn)他的點(diǎn)擊效果吧,也是相當(dāng)點(diǎn)擊簡單,我們只要在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(); /設(shè)置幾秒輪播 vpScroll.setPagerFromTime(1000); /設(shè)置adapter mGridView.setAdapter(new GridViewAdapter(getActivity(); /設(shè)置每次進(jìn)入現(xiàn)最前面 disScroolView.smoothScrollTo(0,0); /* * 初始化GridView的數(shù)據(jù) */ 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論