Android首頁(yè)無(wú)限輪播功能的示例代碼
最近工作不是很忙,也跟大神學(xué)習(xí)下總結(jié)一些小的技術(shù)點(diǎn):
對(duì)于一個(gè)App幾乎都有Banner廣告功能,也就是我們常見(jiàn)的輪播圖,當(dāng)然目前市場(chǎng)第三方框架已經(jīng)非常成熟了,尤其是youth5201314/banner這里有g(shù)ithub地址也可以學(xué)習(xí)下:https://github.com/youth5201314/banner.git
那么下面給大家介紹我的一些總結(jié):
首先分析下輪播圖的設(shè)計(jì)
- 多張輪播圖定時(shí)效果
- 指示點(diǎn)以及每張圖片的文字說(shuō)明
- 實(shí)現(xiàn)無(wú)限輪播,可滑動(dòng),圖片點(diǎn)擊事件
開(kāi)始布局:
<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" tools:context="com.yangziling.carousel.MainActivity"> <!--輪播圖--> <FrameLayout android:layout_width="match_parent" android:layout_height="200dp"> <android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="match_parent"/> <!--指示點(diǎn)和圖片標(biāo)題--> <LinearLayout android:layout_width="match_parent" android:layout_height="35dip" android:layout_gravity="bottom" android:background="#33000000" android:gravity="center" android:orientation="vertical"> <!--圖片配文--> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="圖片標(biāo)題" android:textColor="@android:color/white" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dip" android:orientation="horizontal" > <!--指示點(diǎn)--> <View android:id="@+id/dot_0" style="@style/view_attr" android:background="@drawable/dot_focused"/> <View android:id="@+id/dot_1" style="@style/view_attr" android:background="@drawable/dot_normal"/> <View android:id="@+id/dot_2" style="@style/view_attr" android:background="@drawable/dot_normal"/> <View android:id="@+id/dot_3" style="@style/view_attr" android:background="@drawable/dot_normal"/> <View android:id="@+id/dot_4" style="@style/view_attr" android:background="@drawable/dot_normal"/> </LinearLayout> </LinearLayout> </FrameLayout> </RelativeLayout>
布局中抽取的view屬性:
<style name="view_attr"> <item name="android:layout_width">5dp</item> <item name="android:layout_height">5dp</item> <item name="android:layout_marginLeft">5dp</item> <item name="android:layout_marginRight">5dp</item> </style>
這里我展示的一些圖片是在本地的,通過(guò)網(wǎng)絡(luò)框架加載圖片原理也是一樣的。
這里直接給大家貼出來(lái)核心代碼:
public class MainActivity extends AppCompatActivity { private ViewPager mMyViewPaper; private List<ImageView> images; private List<View> dots; private int currentItem; private TextView title; private MyAdapter adapter; //當(dāng)前顯示圖片的位置 private int localPosition = 0; //圖片的id private int[] imageIds = new int[]{R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e}; //圖片的標(biāo)題 private String[] titles = new String[]{"藍(lán)天白云", "青山綠水", "枯藤老樹(shù)", "人間仙境", "島嶼大樹(shù)"}; private TimerTask mTimerTask; //創(chuàng)建一個(gè)定時(shí)器 private final Timer timer = new Timer(); private ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMyViewPaper = (ViewPager) findViewById(R.id.vp); //顯示的圖片 images = new ArrayList<>(); for (int i = 0; i < imageIds.length; i++) { mImageView = new ImageView(this); mImageView.setBackgroundResource(imageIds[i]); images.add(mImageView); } //指示點(diǎn) dots = new ArrayList<>(); dots.add(findViewById(R.id.dot_0)); dots.add(findViewById(R.id.dot_1)); dots.add(findViewById(R.id.dot_2)); dots.add(findViewById(R.id.dot_3)); dots.add(findViewById(R.id.dot_4)); title = (TextView) findViewById(R.id.title); title.setText(titles[0]); adapter = new MyAdapter(MainActivity.this, images); mMyViewPaper.setAdapter(adapter); mMyViewPaper.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { position = position % images.size(); title.setText(titles[position]); dots.get(position).setBackgroundResource(R.drawable.dot_focused); dots.get(localPosition).setBackgroundResource(R.drawable.dot_normal); localPosition = position; currentItem = position; } /** * 頁(yè)面滑動(dòng)時(shí)回調(diào) */ @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } /** * 當(dāng)ViewPager狀態(tài)改變時(shí),回調(diào) */ @Override public void onPageScrollStateChanged(int state) { } }); } /** * 輪播任務(wù) */ @Override protected void onStart() { super.onStart(); mTimerTask = new TimerTask() { @Override public void run() { currentItem = (currentItem + 1) % imageIds.length; mHandler.sendEmptyMessage(0); } }; timer.schedule(mTimerTask, 2000, 2000); } /** * 接收子線程傳遞的數(shù)據(jù) */ private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { //輪播到最后一張圖片時(shí),直接跳轉(zhuǎn)至第一頁(yè),并且取消滑動(dòng)效果 if (currentItem % images.size() == 0) { mMyViewPaper.setCurrentItem(currentItem, false); } //非最后一張展示圖片的滑動(dòng)效果 mMyViewPaper.setCurrentItem(currentItem, true); } }; @Override protected void onStop() { super.onStop(); timer.cancel(); } }
自定義了一個(gè)Adapter適配器:
public class MyAdapter extends PagerAdapter { private List<ImageView> images; private Context mContext; public MyAdapter(Context context,List<ImageView> images) { this.mContext =context; this.images = images; } //返回Viewpager中的view個(gè)數(shù) @Override public int getCount() { return Integer.MAX_VALUE; } //判斷instantiateItem中的函數(shù)返回的key與一個(gè)頁(yè)面示圖是不是代表同一個(gè) //通常直接相等就OK啦 @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } //移除一個(gè)固定位置的頁(yè)面 @Override public void destroyItem(ViewGroup view, int position, Object object) { view.removeView((View) object); } //將固定位置的View添加到Viewgroup中,并創(chuàng)建顯示出來(lái) @Override public Object instantiateItem(ViewGroup view, final int position) { ImageView imageView = images.get(position % images.size()); ViewGroup parent = (ViewGroup) imageView.getParent(); //這里是動(dòng)態(tài)添加示圖,一個(gè)子類只能有一個(gè)父類 //判斷下如果parent存在一定要記得移除 if (parent != null) { parent.removeView(imageView); } view.addView(imageView); //給圖片添加點(diǎn)擊事件 imageView.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Toast.makeText(mContext,"點(diǎn)擊了第"+(position % images.size()+1)+"圖片",Toast.LENGTH_SHORT).show(); } }); return images.get(position % images.size()); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } }
在這里面也遇到一些問(wèn)題,做了一些“妥協(xié)”,比如說(shuō)無(wú)限輪播的時(shí)候發(fā)現(xiàn)播放到最后一張時(shí)會(huì)返回到第一張?jiān)俅屋啿?,但是?huì)有那種卡頓的感覺(jué)。所以我做了個(gè)“妥協(xié)的處理”,就是在播放到最后一張時(shí),取消自帶的動(dòng)畫(huà)效果,直接跳轉(zhuǎn)到第一張,然后進(jìn)行輪播。
private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { //輪播到最后一張圖片時(shí),直接跳轉(zhuǎn)至第一頁(yè),并且取消滑動(dòng)效果 if (currentItem % images.size() == 0) { mMyViewPaper.setCurrentItem(currentItem, false); } //非最后一張展示圖片的滑動(dòng)效果 mMyViewPaper.setCurrentItem(currentItem, true); } };
項(xiàng)目的github地址:https://github.com/yangziling/Carousel.git
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android Notification的多種用法總結(jié)
這篇文章主要介紹了Android Notification的多種用法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-06-06Android編程實(shí)現(xiàn)禁止?fàn)顟B(tài)欄下拉的方法詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)禁止?fàn)顟B(tài)欄下拉的方法,結(jié)合實(shí)例形式詳細(xì)分析了Android狀態(tài)欄操作相關(guān)的函數(shù)、屬性調(diào)用及權(quán)限控制設(shè)置技巧,需要的朋友可以參考下2017-08-08Android 接收微信、QQ其他應(yīng)用打開(kāi)第三方分享功能
這篇文章主要介紹了Android 接收微信、QQ其他應(yīng)用打開(kāi),第三方分享 ,思路很簡(jiǎn)單通過(guò)在AndroidManifest.xml注冊(cè)ACTION事件,在用于接收分享的Activity里面加接收代碼,感興趣的朋友可以一起學(xué)習(xí)下2022-11-11Android實(shí)現(xiàn)網(wǎng)絡(luò)加載時(shí)的對(duì)話框功能
這篇文章主要介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)加載時(shí)的對(duì)話框功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Android?上實(shí)現(xiàn)DragonBones換裝功能
這篇文章主要介紹了Android?上實(shí)現(xiàn)DragonBones換裝功能,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06深入U(xiǎn)nderstanding Android ContentProvider詳解
本篇文章是對(duì)Android ContentProvider進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05安卓(Android) 監(jiān)聽(tīng)按鍵長(zhǎng)按事件
本文主要介紹Android 中監(jiān)聽(tīng)按鍵的長(zhǎng)按事件,對(duì)按鍵機(jī)制進(jìn)行詳解,并附有代碼實(shí)例,具有參考價(jià)值,希望能幫到有需要的小伙伴2016-07-07Flutter 快速實(shí)現(xiàn)聊天會(huì)話列表效果示例詳解
這篇文章主要為大家介紹了Flutter 快速實(shí)現(xiàn)聊天會(huì)話列表效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10