Android實(shí)現(xiàn)自動輪播圖效果
本文實(shí)例為大家分享了Android實(shí)現(xiàn)輪播圖效果展示的具體代碼,供大家參考,具體內(nèi)容如下
MainActivity.java
public class MainActivity extends AppCompatActivity { private LinearLayout ll_dots; private TextView viewpager_tv; // 將ViewPager定義為全局變量,方便使用. private ViewPager viewpager_vp; // 建立一個(gè)ArrayList集合.泛型指定為ImageView. ArrayList<ImageView> imageViews = new ArrayList<ImageView>(); //創(chuàng)建一個(gè)handler對象,復(fù)寫handlerMessage方法,用switch方法,通過msg.what得到標(biāo)識.333 private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: //得到當(dāng)前VIewPager和用戶交互的item條目.VIewPager對象.getCurrentItem 333 int currentItem = viewpager_vp.getCurrentItem(); //設(shè)置ViewPager當(dāng)前顯示的界面,得到的ITem+1 viewpager_vp.setCurrentItem(currentItem + 1); //通過靜態(tài)方法sendEmptyMessageDelayed,延時(shí)重復(fù)執(zhí)行命令.注意不是sendEmptyMessageAtTime 333 sendEmptyMessageDelayed(1, 3000); break; default: break; } } }; //圖片int數(shù)組資源 private int[] imageResIds = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e, R.drawable.f}; //圖片字符串?dāng)?shù)組String[]資源. private String[] descs = { "網(wǎng)頁設(shè)計(jì)師聯(lián)盟", "教程網(wǎng)", "PS聯(lián)盟", "25學(xué)堂", "課工場帶你逆襲,助你走向人生巔峰", "當(dāng)你因需求被項(xiàng)目經(jīng)理頻繁修改,而想之暴打時(shí),請先看易老師賤笑圖,你是不是更想打我了" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //對控件進(jìn)行初始化 init(); } /** * 對VIewPager進(jìn)行初始化. */ private void init() { //找到可以設(shè)置點(diǎn)的容器LinearLayout的對象,進(jìn)行點(diǎn)的添加 ll_dots = (LinearLayout) findViewById(R.id.ll_dots); //找到文本的對象. viewpager_tv = (TextView) findViewById(R.id.viewpager_tv); //找到VIewPager對象. viewpager_vp = (ViewPager) findViewById(R.id.viewpager_vp); //更加圖片int數(shù)組資源的數(shù)量,動態(tài)的創(chuàng)建ImageView控件.就是有幾張圖片,創(chuàng)建幾個(gè)ImageView,for循環(huán) for (int x = 0; x < imageResIds.length; x++) { //創(chuàng)建ImageView對象 ImageView imageView = new ImageView(this); //通過該對象添加圖片資源.setBackgroundResource方法. imageView.setBackgroundResource(imageResIds[x]); //把控件添加到集合ImageViews中去,以方便在VIewPager的適配器里instantiateItem方法獲取. imageViews.add(imageView); //進(jìn)行點(diǎn)的添加,其個(gè)數(shù)和圖片的個(gè)數(shù)一致,因此放到該循環(huán)中.222 dot(); } //設(shè)置適配器.setAdapter viewpager_vp.setAdapter(new Myadapter()); //設(shè)置ViewPager的滑動監(jiān)聽器,addOnPageChangeListener,set的方法因?yàn)槊值脑虮惶蕴?在onPageScrolled中.222 viewpager_vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //同過getCurrentItem方法拿到當(dāng)前用戶所交互ViewPager的item位置. int currentItem = viewpager_vp.getCurrentItem(); //通過得到的這個(gè)item,給text和點(diǎn)進(jìn)行選中的設(shè)置. changeTextAndDot(currentItem % imageResIds.length); Log.d("aaa", "onPageScrolled: Position-" + position + " positionOffset-" + positionOffset + " positionOffsetPixels-" + positionOffsetPixels); } @Override public void onPageSelected(int position) { Log.d("aaa", "onPageSelected: position" + position); } @Override public void onPageScrollStateChanged(int state) { Log.d("aaa", "onPageScrollStateChanged: state" + state); } }); //指定VIewPager默認(rèn)跳轉(zhuǎn)到某頁.一般是最大數(shù)的一般.setCurrentItem就是設(shè)置VIewPager跳到哪頁,get是獲取.333 viewpager_vp.setCurrentItem(Integer.MAX_VALUE / 2 - 3); //通過handler,3秒后開始循環(huán)ViwePager的item.sendEmptyMessageDelayed,333 handler.sendEmptyMessageDelayed(1, 3000); //設(shè)置VIewPager的觸摸事件.最后抽成方法.333 ViewPagerTouchEvent(); } /** * 注意:看一個(gè)方法或類的信息快捷鍵:Ctrl+Q; * 像ListVIew一樣,創(chuàng)建一個(gè)ViewPager的適配器,自定義一個(gè)類繼承PagerAdapter */ private class Myadapter extends PagerAdapter { //getContent,設(shè)置ViewPager的條目個(gè)數(shù).一般就是集合或者資源數(shù)組的長度. @Override public int getCount() { //把返回的條目設(shè)置為無限大.333 //注意:一般和獲取ViewPager當(dāng)前選中的是第幾頁有關(guān)的都要改為position(當(dāng)前頁數(shù))%list.size()(取余數(shù)),你就看哪報(bào)錯(cuò),根據(jù)報(bào)錯(cuò)改333 return Integer.MAX_VALUE; } //isViewFromObject,判斷ViewPager的條目View對象和InstantiateItem返回的Object對象是否一致,固定格式:return view==object; @Override public boolean isViewFromObject(View view, Object object) { return view == object; } //Ctrl+H:看到一個(gè)類的基礎(chǔ)結(jié)構(gòu)圖 ctrl+h+l:快速格式化. //instantiateItem,ViewPager添加條目的操作.container:VIewPager的化身,控件都是添加到他身上,position:代表用戶滑動條目的位置 @Override public Object instantiateItem(ViewGroup container, int position) { //根據(jù)條目所在位置(利用Position),從ImageViews集合里獲取相對應(yīng)的ImageVIew圖片. ImageView imageView = imageViews.get(position % imageResIds.length); //把得到ImageView對象,添加給VIewPager對象,也就是container,使用addView container.addView(imageView); //注意:你添加給VIewPager什么控件,就要返回該控件,給isViewFromObject進(jìn)行比較判斷,這里添加的是ImageView,返回的就是ImageView return imageView; } //防止內(nèi)存泄漏.相當(dāng)于ListView的復(fù)用container,銷毀一個(gè)page,該方法的實(shí)際就是將instantiateItem返回的VIew對象從ViewPager中移除, //container:還是ViewPager控件自身 position: object:則代表了View控件,使用時(shí)要強(qiáng)轉(zhuǎn)成View一下 //補(bǔ)充:為什么參數(shù)是Object,而不直接是View,因?yàn)殡m然99%是view,但也有可能是Fragment,所以用Object,提高了可擴(kuò)展性. @Override public void destroyItem(ViewGroup container, int position, Object object) { //構(gòu)造方法刪除后,也是固定格式:container.removeView((View) object); container.removeView((View) object); } } /** * 更加圖片資源的數(shù)量,動態(tài)的創(chuàng)建點(diǎn)222 */ public void dot() { //創(chuàng)建一個(gè)View對象; View view = new View(this); //為這個(gè)View對象設(shè)置背景setBackgroundResource view.setBackgroundResource(R.drawable.dot_normal); //為View對象設(shè)置寬高參數(shù),使用參數(shù)對象LayoutParams(int,int),給哪個(gè)容器,就用哪個(gè)容器創(chuàng)建 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(8, 8); //使用參數(shù)對象LayoutParams.leftMargin=int,相當(dāng)于布局里的padding. layoutParams.leftMargin = 8; //把準(zhǔn)備好的layoutParams參數(shù)對象,設(shè)置給View對象.setLayoutParams view.setLayoutParams(layoutParams); //最后容器對象.addView(VIwe); ll_dots.addView(view); } /** * 根據(jù)ViewPager的item的變化,也就是圖片切換的操作,設(shè)置對應(yīng)的點(diǎn)和文本.222 * * @param position int ViewPager的item,也是圖片的位置 */ public void changeTextAndDot(int position) { //根據(jù)ViewPager的item的變化,設(shè)置對應(yīng)的文本.setText(descs[position]); viewpager_tv.setText(descs[position]); //對點(diǎn)進(jìn)行判斷是否是當(dāng)前頁的點(diǎn),用for循環(huán),拿到所有點(diǎn)的位置,然后和position對比 for (int x = 0; x < imageResIds.length; x++) { //.getChildAt(x);拿到容器的子控件.得到VIew對象 View childAt = ll_dots.getChildAt(x); //為View設(shè)置背景圖片,,使用三元運(yùn)算符. childAt.setBackgroundResource(x == position ? R.drawable.dot_focus : R.drawable.dot_normal); } } /** * 該方法主要設(shè)置VIewPager的觸摸事件,實(shí)現(xiàn)用戶的觸摸時(shí),不再自動播放.switch中motionEvent.getActivity.333 * 另一種實(shí)現(xiàn)的思路,是在ViewPager監(jiān)聽事件里面,對ViewPager的狀態(tài)進(jìn)行判斷.閑置-滑動,和用戶交互中-移除滑動. * public void onPageScrollStateChanged(int state) { * //當(dāng)滑動狀態(tài)發(fā)生改變的時(shí)候,手動滑動的時(shí)候,不能進(jìn)行界面切換操作 * //SCROLL_STATE_IDLE : 空閑狀態(tài) * if (state == ViewPager.SCROLL_STATE_IDLE) { * //自動切換界面 * handler.sendEmptyMessageDelayed(VIEWPAGER_SWITCH_PAGE, 3000); * }else{ * //停止自動切換 * //停止界面切換操作 * handler.removeMessages(VIEWPAGER_SWITCH_PAGE); * } * } */ public void ViewPagerTouchEvent() { viewpager_vp.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: //當(dāng)時(shí)MotionEvent.ACTION_DOWN和ACTION_MOVE,就移除handler發(fā)送的message.removeMessages.333 handler.removeMessages(1); break; case MotionEvent.ACTION_MOVE: handler.removeMessages(1); break; //當(dāng)用戶手松開時(shí)ACTION_UP,就繼續(xù)使用sendEmptyMessageDelayed發(fā)送handler的消息.333 case MotionEvent.ACTION_UP: handler.sendEmptyMessageDelayed(1, 3000); default: break; } return false; } }); } @Override protected void onDestroy() { super.onDestroy(); handler.removeMessages(1); } }
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/viewpager_vp" android:layout_width="wrap_content" android:layout_height="300dp" /> <!-- 定義lineatLayout時(shí),background="#88000000",gravity="center_horizontal" padding="8dp" android:layout_alignBottom="@+id/viewpager_vp" 小點(diǎn)用一個(gè)LinearLayout來包裹.--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#88000000" android:gravity="center_horizontal" android:padding="8dp" android:layout_alignBottom="@+id/viewpager_vp" android:orientation="vertical"> <!--此處狀態(tài)選擇器的選擇屬性是state_selected,而不是state_pressed, 要知道他們的區(qū)別,引用圖片drawable,注意V是大寫, 點(diǎn)是根據(jù)圖片的張數(shù),動態(tài)創(chuàng)建的,所有我們的View還要注釋掉.-->text <TextView android:id="@+id/viewpager_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white" android:text="我是帥哥"/> <LinearLayout android:id="@+id/ll_dots" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_horizontal"> <!-- <View android:layout_width="5dp" android:layout_height="5dp" android:background="@drawable/dot_focus"/>--> </LinearLayout> </LinearLayout> </RelativeLayout>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義控件實(shí)現(xiàn)簡單的輪播圖控件
- Android ViewPager實(shí)現(xiàn)輪播圖效果
- Android自定義控件實(shí)現(xiàn)優(yōu)雅的廣告輪播圖
- Android實(shí)現(xiàn)基于ViewPager的無限循環(huán)自動播放帶指示器的輪播圖CarouselFigureView控件
- Android如何使用RecyclerView打造首頁輪播圖
- 簡單實(shí)現(xiàn)android輪播圖
- Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法
- Android實(shí)現(xiàn)輪播圖無限循環(huán)效果
- Android下拉刷新與輪播圖滑動沖突解決方案
- Android實(shí)現(xiàn)ViewPage輪播圖效果
相關(guān)文章
Andriod Studio實(shí)現(xiàn)保存QQ密碼功能(案例代碼詳解)
這篇文章主要介紹了Andriod Studio實(shí)現(xiàn)保存QQ密碼功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03使用Flutter實(shí)現(xiàn)一個(gè)走馬燈布局的示例代碼
這篇文章主要介紹了使用 Flutter 實(shí)現(xiàn)一個(gè)走馬燈布局的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Android RecyclerView 實(shí)現(xiàn)快速滾動的示例代碼
本篇文章主要介紹了Android RecyclerView 實(shí)現(xiàn)快速滾動的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09Android開發(fā)adb.exe'' and can be executed.錯(cuò)誤解決方法
這篇文章主要介紹了Android開發(fā)adb.exe' and can be executed.錯(cuò)誤解決方法,本文分析了問題的可能原因并給出了排查步驟,需要的朋友可以參考下2015-06-06Android 啟動 Service(startservice和bindservice) 兩種方式的區(qū)別
andrid service 兩種啟動方式:第一種startservice,第二種bindservice,大家對這兩種啟動方式的區(qū)別了解嗎,下面跟著小編一起學(xué)習(xí)吧2015-11-11Android Listview 滑動過程中提示圖片重復(fù)錯(cuò)亂的原因及解決方法
android中l(wèi)istview是比較常見的組件,通過本文主要給大家分析Android中Listview滾動過程造成的圖片顯示重復(fù)、錯(cuò)亂、閃爍的原因及解決方法,順便跟進(jìn)Listview的緩存機(jī)制,感興趣的朋友一起看下吧2016-08-08