Android實(shí)現(xiàn)自動(dòng)輪播圖效果
本文實(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對(duì)象,復(fù)寫handlerMessage方法,用switch方法,通過(guò)msg.what得到標(biāo)識(shí).333
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
//得到當(dāng)前VIewPager和用戶交互的item條目.VIewPager對(duì)象.getCurrentItem 333
int currentItem = viewpager_vp.getCurrentItem();
//設(shè)置ViewPager當(dāng)前顯示的界面,得到的ITem+1
viewpager_vp.setCurrentItem(currentItem + 1);
//通過(guò)靜態(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)頁(yè)設(shè)計(jì)師聯(lián)盟",
"教程網(wǎng)",
"PS聯(lián)盟",
"25學(xué)堂",
"課工場(chǎng)帶你逆襲,助你走向人生巔峰",
"當(dāng)你因需求被項(xiàng)目經(jīng)理頻繁修改,而想之暴打時(shí),請(qǐng)先看易老師賤笑圖,你是不是更想打我了"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//對(duì)控件進(jìn)行初始化
init();
}
/**
* 對(duì)VIewPager進(jìn)行初始化.
*/
private void init() {
//找到可以設(shè)置點(diǎn)的容器LinearLayout的對(duì)象,進(jìn)行點(diǎn)的添加
ll_dots = (LinearLayout) findViewById(R.id.ll_dots);
//找到文本的對(duì)象.
viewpager_tv = (TextView) findViewById(R.id.viewpager_tv);
//找到VIewPager對(duì)象.
viewpager_vp = (ViewPager) findViewById(R.id.viewpager_vp);
//更加圖片int數(shù)組資源的數(shù)量,動(dòng)態(tài)的創(chuàng)建ImageView控件.就是有幾張圖片,創(chuàng)建幾個(gè)ImageView,for循環(huán)
for (int x = 0; x < imageResIds.length; x++) {
//創(chuàng)建ImageView對(duì)象
ImageView imageView = new ImageView(this);
//通過(guò)該對(duì)象添加圖片資源.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的滑動(dòng)監(jiān)聽(tīng)器,addOnPageChangeListener,set的方法因?yàn)槊值脑虮惶蕴?在onPageScrolled中.222
viewpager_vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//同過(guò)getCurrentItem方法拿到當(dāng)前用戶所交互ViewPager的item位置.
int currentItem = viewpager_vp.getCurrentItem();
//通過(guò)得到的這個(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)到某頁(yè).一般是最大數(shù)的一般.setCurrentItem就是設(shè)置VIewPager跳到哪頁(yè),get是獲取.333
viewpager_vp.setCurrentItem(Integer.MAX_VALUE / 2 - 3);
//通過(guò)handler,3秒后開(kāi)始循環(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ù)組的長(zhǎng)度.
@Override
public int getCount() {
//把返回的條目設(shè)置為無(wú)限大.333
//注意:一般和獲取ViewPager當(dāng)前選中的是第幾頁(yè)有關(guān)的都要改為position(當(dāng)前頁(yè)數(shù))%list.size()(取余數(shù)),你就看哪報(bào)錯(cuò),根據(jù)報(bào)錯(cuò)改333
return Integer.MAX_VALUE;
}
//isViewFromObject,判斷ViewPager的條目View對(duì)象和InstantiateItem返回的Object對(duì)象是否一致,固定格式: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:代表用戶滑動(dòng)條目的位置
@Override
public Object instantiateItem(ViewGroup container, int position) {
//根據(jù)條目所在位置(利用Position),從ImageViews集合里獲取相對(duì)應(yīng)的ImageVIew圖片.
ImageView imageView = imageViews.get(position % imageResIds.length);
//把得到ImageView對(duì)象,添加給VIewPager對(duì)象,也就是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對(duì)象從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ù)量,動(dòng)態(tài)的創(chuàng)建點(diǎn)222
*/
public void dot() {
//創(chuàng)建一個(gè)View對(duì)象;
View view = new View(this);
//為這個(gè)View對(duì)象設(shè)置背景setBackgroundResource
view.setBackgroundResource(R.drawable.dot_normal);
//為View對(duì)象設(shè)置寬高參數(shù),使用參數(shù)對(duì)象LayoutParams(int,int),給哪個(gè)容器,就用哪個(gè)容器創(chuàng)建
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(8, 8);
//使用參數(shù)對(duì)象LayoutParams.leftMargin=int,相當(dāng)于布局里的padding.
layoutParams.leftMargin = 8;
//把準(zhǔn)備好的layoutParams參數(shù)對(duì)象,設(shè)置給View對(duì)象.setLayoutParams
view.setLayoutParams(layoutParams);
//最后容器對(duì)象.addView(VIwe);
ll_dots.addView(view);
}
/**
* 根據(jù)ViewPager的item的變化,也就是圖片切換的操作,設(shè)置對(duì)應(yīng)的點(diǎn)和文本.222
*
* @param position int ViewPager的item,也是圖片的位置
*/
public void changeTextAndDot(int position) {
//根據(jù)ViewPager的item的變化,設(shè)置對(duì)應(yīng)的文本.setText(descs[position]);
viewpager_tv.setText(descs[position]);
//對(duì)點(diǎn)進(jìn)行判斷是否是當(dāng)前頁(yè)的點(diǎn),用for循環(huán),拿到所有點(diǎn)的位置,然后和position對(duì)比
for (int x = 0; x < imageResIds.length; x++) {
//.getChildAt(x);拿到容器的子控件.得到VIew對(duì)象
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í),不再自動(dòng)播放.switch中motionEvent.getActivity.333
* 另一種實(shí)現(xiàn)的思路,是在ViewPager監(jiān)聽(tīng)事件里面,對(duì)ViewPager的狀態(tài)進(jìn)行判斷.閑置-滑動(dòng),和用戶交互中-移除滑動(dòng).
* public void onPageScrollStateChanged(int state) {
* //當(dāng)滑動(dòng)狀態(tài)發(fā)生改變的時(shí)候,手動(dòng)滑動(dòng)的時(shí)候,不能進(jìn)行界面切換操作
* //SCROLL_STATE_IDLE : 空閑狀態(tài)
* if (state == ViewPager.SCROLL_STATE_IDLE) {
* //自動(dòng)切換界面
* handler.sendEmptyMessageDelayed(VIEWPAGER_SWITCH_PAGE, 3000);
* }else{
* //停止自動(dòng)切換
* //停止界面切換操作
* 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)用戶手松開(kāi)時(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來(lái)包裹.-->
<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ù),動(dòng)態(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>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義控件實(shí)現(xiàn)簡(jiǎn)單的輪播圖控件
- Android ViewPager實(shí)現(xiàn)輪播圖效果
- Android自定義控件實(shí)現(xiàn)優(yōu)雅的廣告輪播圖
- Android實(shí)現(xiàn)基于ViewPager的無(wú)限循環(huán)自動(dòng)播放帶指示器的輪播圖CarouselFigureView控件
- Android如何使用RecyclerView打造首頁(yè)輪播圖
- 簡(jiǎn)單實(shí)現(xiàn)android輪播圖
- Android開(kāi)發(fā)在輪播圖片上加入點(diǎn)擊事件的方法
- Android實(shí)現(xiàn)輪播圖無(wú)限循環(huán)效果
- Android下拉刷新與輪播圖滑動(dòng)沖突解決方案
- Android實(shí)現(xiàn)ViewPage輪播圖效果
相關(guān)文章
Android 三種動(dòng)畫(huà)詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android 三種動(dòng)畫(huà)詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04
圖文詳解Android Studio搭建Android集成開(kāi)發(fā)環(huán)境的過(guò)程
這篇文章主要以圖文的方式詳細(xì)介紹了Android Studio搭建Android集成開(kāi)發(fā)環(huán)境的過(guò)程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12
詳解Android廣播Broadcast的啟動(dòng)流程
這篇文章主要為大家介紹了Android廣播Broadcast啟動(dòng)流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
flutter 輪播圖動(dòng)態(tài)加載網(wǎng)絡(luò)圖片的方法
Flutter是谷歌的移動(dòng)UI框架,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面。這篇文章主要介紹了flutter 輪播圖動(dòng)態(tài)加載網(wǎng)絡(luò)圖片的方法 ,需要的朋友可以參考下2019-07-07
Android實(shí)現(xiàn)多進(jìn)程并發(fā)控制的兩種方案
當(dāng)一個(gè)App中存在多個(gè)進(jìn)程時(shí)例如存在?主進(jìn)程,輔進(jìn)程兩個(gè)進(jìn)程,兩個(gè)進(jìn)程都會(huì)去向A文件中寫入數(shù)據(jù),但是我們業(yè)務(wù)中希望每次僅允許有一個(gè)進(jìn)程向A文件寫入內(nèi)容,所以本文給大家介紹了Android實(shí)現(xiàn)多進(jìn)程并發(fā)控制的兩種方案,需要的朋友可以參考下2025-04-04
Android HorizontalScrollView內(nèi)子控件橫向拖拽實(shí)例代碼
本文主要介紹Android HorizontalScrollView的使用,這里給大家一個(gè)實(shí)例來(lái)展示HorizontalScrollView內(nèi)子控件橫向拖拽的效果實(shí)現(xiàn),有需要的小伙伴可以參考下2016-07-07
Android實(shí)現(xiàn)樹(shù)形層級(jí)ListView
這篇文章主要介紹了Android實(shí)現(xiàn)樹(shù)形層級(jí)ListView的相關(guān)資料,需要的朋友可以參考下2016-02-02
AndroidStudio4.0 New Class的坑(小結(jié))
這篇文章主要介紹了AndroidStudio4.0 New Class的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
android自定義toast(widget開(kāi)發(fā))示例
這篇文章主要介紹了android自定義toast(widget開(kāi)發(fā))示例,需要的朋友可以參考下2014-03-03

