Android編程實(shí)現(xiàn)ListView頭部ViewPager廣告輪詢圖效果
本文實(shí)例講述了Android編程實(shí)現(xiàn)ListView頭部ViewPager廣告輪詢圖效果。分享給大家供大家參考,具體如下:
之前看了別人的一些軟件,發(fā)現(xiàn)其廣告圖輪詢的時(shí)候,那個(gè)廣告感覺和ViewPager的效果不太一樣,后來也查了一下,是因?yàn)闀r(shí)間問題,找了一些資料,自己也實(shí)踐一下。
1、為了解決ListView頭部加ViewPager滑動(dòng)沖突問題,必須自定義ListView,重寫里面的onInterceptTouchEvent方法,ListView代碼如下:
package com.example.testa; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ListView; public class DefinedListView extends ListView { public DefinedListView(Context context) { super(context); } public DefinedListView(Context context, AttributeSet attrs) { super(context, attrs); } public DefinedListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private float xDistance, yDistance, xLast, yLast; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = yDistance = 0f; xLast = ev.getX(); yLast = ev.getY(); break; case MotionEvent.ACTION_MOVE: final float curX = ev.getX(); final float curY = ev.getY(); xDistance += Math.abs(curX - xLast); yDistance += Math.abs(curY - yLast); xLast = curX; yLast = curY; if (xDistance > yDistance) { return false; } } return super.onInterceptTouchEvent(ev); } }
2、為了讓廣告輪詢的速度減慢,必須重新設(shè)置ViewPager的Scroller,自定義的Scroller如下:
package com.example.testa; import java.lang.reflect.Field; import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.animation.Interpolator; import android.widget.Scroller; public class DefinedScroller extends Scroller { private int DURATION_TIME = 1000; private boolean shouldAutoScroll = true; private ViewPager viewPager = null; @SuppressLint("HandlerLeak") private final Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (shouldAutoScroll) { viewPager.setCurrentItem(viewPager.getCurrentItem() + 1); handler.sendEmptyMessageDelayed(0, 2000); } }; }; public DefinedScroller(Context context) { super(context); } public DefinedScroller(Context context, Interpolator interpolator) { super(context, interpolator); } private View initViewPager(Context context) { View view = LayoutInflater.from(context).inflate(R.layout.view_pager_layout, null); this.viewPager = (ViewPager) view.findViewById(R.id.viewpager); this.viewPager.setOffscreenPageLimit(2); this.viewPager.setAdapter(new MyFragmentPagerAdapter(((FragmentActivity) context).getSupportFragmentManager())); return view; } public ViewPager getViewPager() { return viewPager; } public View initView(Context context) { View view = initViewPager(context); this.viewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { shouldAutoScroll = true; handler.sendEmptyMessageDelayed(0, 2000); } else { handler.removeMessages(0); shouldAutoScroll = false; } return false; } }); try { Field mScroller = ViewPager.class.getDeclaredField("mScroller"); mScroller.setAccessible(true); mScroller.set(viewPager, this); } catch (NoSuchFieldException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } handler.sendEmptyMessageDelayed(0, 2000); return view; } public void setShouldAutoScroll() { handler.removeMessages(0); if (viewPager.isShown()) { shouldAutoScroll = true; handler.sendEmptyMessageDelayed(0, 2000); } else { shouldAutoScroll = false; } } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, shouldAutoScroll ? DURATION_TIME : duration); } }
關(guān)鍵是startScroll方法啦
3、其他測(cè)試類,
(1)TestFragment:
package com.example.testa; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; public class TestFragment extends Fragment { public int imageResource = 0; public static TestFragment newInstance(int imageResource) { TestFragment newFragment = new TestFragment(); newFragment.imageResource = imageResource; return newFragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.pager_layout, null); ImageView textView = (ImageView) view.findViewById(R.id.image); textView.setImageResource(imageResource); return view; } }
(2)ViewPager的Adapter類:
package com.example.testa; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public Fragment getItem(int arg0) { switch (arg0 % 4) { case 0: return TestFragment.newInstance(R.drawable.a1); case 1: return TestFragment.newInstance(R.drawable.default_wh); case 2: return TestFragment.newInstance(R.drawable.default_ww); case 3: return TestFragment.newInstance(R.drawable.test); default: return TestFragment.newInstance(R.drawable.a1); } } }
(3)測(cè)試的Activity:
package com.example.testa; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.TextView; public class MainActivity extends FragmentActivity { private DefinedListView listView = null; private List<String> list = null; private DefinedScroller definedScroller = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (DefinedListView) findViewById(R.id.listview); initListData(); initViewPager(); listView.setAdapter(new ListAdapter()); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { definedScroller.getViewPager().setCurrentItem(definedScroller.getViewPager().getCurrentItem() + 1); } }); listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == SCROLL_STATE_IDLE) { definedScroller.setShouldAutoScroll(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); } private void initListData() { list = new ArrayList<String>(); for (int i = 1; i <= 20; ++i) { list.add("test" + i); } } private void initViewPager() { definedScroller = new DefinedScroller(this); listView.addHeaderView(definedScroller.initView(this)); } private class ListAdapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView textView = (TextView) LayoutInflater.from(MainActivity.this).inflate(R.layout.text_view_layout, null); textView.setPadding(20, 20, 20, 20); textView.setText(list.get(position)); return textView; } } }
4、布局文件就算了吧
上面有些是在別的地方看到的,很久了,忘記在哪里看到的了,就寫不上源地址了,敬請(qǐng)見諒。
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
詳解Android SpannableString多行圖文混排的應(yīng)用實(shí)戰(zhàn)
本篇文章主要介紹了Android SpannableString多行圖文混排的應(yīng)用實(shí)戰(zhàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android中的動(dòng)態(tài)加載機(jī)制的學(xué)習(xí)研究
本篇文章主要介紹了Android中的動(dòng)態(tài)加載機(jī)制,對(duì)android項(xiàng)目開發(fā)有著一定的幫助,有興趣的同學(xué)可以了解一下。2016-11-11android 中win10 使用uwp控件實(shí)現(xiàn)進(jìn)度條Marquez效果
這篇文章主要介紹了android 中win10 使用uwp控件實(shí)現(xiàn)進(jìn)度條Marquez效果,需要的朋友可以參考下2017-06-06Flutter中使用setState時(shí)的6個(gè)簡(jiǎn)單技巧總結(jié)
平常在使用flutter的控件時(shí)我們都知道,要刷新頁面那么只需要調(diào)用setState()方法即可,這篇文章主要給大家介紹了關(guān)于Flutter中使用setState時(shí)的6個(gè)簡(jiǎn)單技巧,需要的朋友可以參考下2022-05-05Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問題小結(jié)
這篇文章給大家介紹了Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問題,在沒給大家介紹這下問題之前,先給大家說下基本定義和基本使用方式,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,對(duì)android 6.0 動(dòng)態(tài)權(quán)限遇到問題感興趣的朋友一起看看吧2016-11-11android利用ContentResolver訪問者獲取手機(jī)短信信息
本篇文章主要介紹了android利用ContentResolver訪問者獲取手機(jī)短信信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02Android自定義view系列之99.99%實(shí)現(xiàn)QQ側(cè)滑刪除效果實(shí)例代碼詳解
這篇文章給大家介紹android自定義view系列之99.99%實(shí)現(xiàn)QQ側(cè)滑刪除效果,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧2016-09-09Android編程解析XML方法詳解(SAX,DOM與PULL)
這篇文章主要介紹了Android編程解析XML方法,結(jié)合實(shí)例形式詳細(xì)分析了Android解析XML文件的常用方法與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-01-01Android封裝的http請(qǐng)求實(shí)用工具類
提供一個(gè)Android封裝的http請(qǐng)求實(shí)用工具類,在做ANDROID網(wǎng)絡(luò)開發(fā)中這個(gè)經(jīng)常要用到,大家可以參考下面的工具類修改成自己的工具2013-11-11Android控件WebView實(shí)現(xiàn)完整截圖
這篇文章主要為大家詳細(xì)介紹了Android控件WebView實(shí)現(xiàn)完整截圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05