国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android完美實(shí)現(xiàn)平滑過渡的ViewPager廣告條

2019-12-12 04:44:25
字體:
供稿:網(wǎng)友

我們經(jīng)常會(huì)看到有一些app的banner界面可以實(shí)現(xiàn)循環(huán)播放多個(gè)廣告圖片和手動(dòng)滑動(dòng)循環(huán)的效果。看到那樣的效果,相信大家都會(huì)想到ViewPager,但是ViewPager并不支持循環(huán)翻頁,所以要實(shí)現(xiàn)循環(huán)還得需要自己去動(dòng)手。最后還有一個(gè)問題就是翻頁到最后一頁如何平滑過渡到首頁的問題。這些都源于有人私信問我ViewPager廣告條如何平滑過渡的問題,出于這個(gè)問題,我想著親自實(shí)現(xiàn)并分享下吧,本篇就是為了解決這些問題而寫的。

1.初始化布局

我們先來寫一個(gè)ViewPager廣告條的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager  android:id="@+id/vp"  android:layout_width="match_parent"  android:layout_height="210dp"/> <LinearLayout  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_alignBottom="@id/vp"  android:background="#55000000"  android:gravity="center_horizontal"  android:orientation="vertical"  android:padding="5dp">  <TextView   android:id="@+id/tv_img_desc"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:text="這里是廣告標(biāo)題"   android:textColor="#ffffff"   android:textSize="16sp"/>  <!-- 動(dòng)態(tài)添加小圓點(diǎn),用一個(gè)水平的線性布局 -->  <LinearLayout   android:id="@+id/ll_dot_group"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:orientation="horizontal"/> </LinearLayout></RelativeLayout>

此時(shí)的效果如下,是不是已經(jīng)有了點(diǎn)模樣:

2.Activity實(shí)現(xiàn)

接下來進(jìn)入到關(guān)鍵的實(shí)現(xiàn)代碼,當(dāng)然,Activity實(shí)現(xiàn)也難不倒我們,其中ViewPager數(shù)據(jù),為了方便,本篇就直接用本地?cái)?shù)據(jù)進(jìn)行模擬了。而在實(shí)際項(xiàng)目開發(fā)數(shù)據(jù)大都來自網(wǎng)絡(luò)。

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { private List<ImageView> vpLists; private LinearLayout ll_dot_group; //用來添加小圓點(diǎn) private String[] imageDescArrs; private TextView tv_img_desc; private ViewPager vp; private boolean isSwitchPager = false; //默認(rèn)不切換 private int previousPosition = 0; //默認(rèn)為0 private Handler handler = new Handler() {  public void handleMessage(android.os.Message msg) {   //更新當(dāng)前viewpager的 要顯示的當(dāng)前條目   vp.setCurrentItem(vp.getCurrentItem() + 1);  } }; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  initView(); } /**  * 初始化view  */ private void initView() {  vp = (ViewPager) findViewById(R.id.vp);  ll_dot_group = (LinearLayout) findViewById(R.id.ll_dot_group);  tv_img_desc = (TextView) findViewById(R.id.tv_img_desc);  initViewPagerData();  vp.setAdapter(new ViewpagerAdapter());  //設(shè)置當(dāng)前viewpager要顯示第幾個(gè)條目  int item = Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2 % vpLists.size());  vp.setCurrentItem(item);  //把第一個(gè)小圓點(diǎn)設(shè)置為白色,顯示第一個(gè)textview內(nèi)容  ll_dot_group.getChildAt(previousPosition).setEnabled(true);  tv_img_desc.setText(imageDescArrs[previousPosition]);  //設(shè)置viewpager滑動(dòng)的監(jiān)聽事件  vp.addOnPageChangeListener(this);  //實(shí)現(xiàn)自動(dòng)切換的功能  new Thread() {   public void run() {    while (!isSwitchPager) {     SystemClock.sleep(3000);     //拿著我們創(chuàng)建的handler 發(fā)消息     handler.sendEmptyMessage(0);    }   }  }.start(); } /**  * 初始化ViewPager的數(shù)據(jù)  */ private void initViewPagerData() {  imageDescArrs = new String[]{"標(biāo)題1", "標(biāo)題2", "標(biāo)題3", "標(biāo)題4", "標(biāo)題5"};  vpLists = new ArrayList<ImageView>();  int imgIds[] = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e};  ImageView iv;  View dotView;  for (int i = 0; i < imgIds.length; i++) {   iv = new ImageView(this);   iv.setBackgroundResource(imgIds[i]);   vpLists.add(iv);   //準(zhǔn)備小圓點(diǎn)的數(shù)據(jù)   dotView = new View(getApplicationContext());   dotView.setBackgroundResource(R.drawable.selector_dot);   //設(shè)置小圓點(diǎn)的寬和高   LayoutParams params = new LayoutParams(15, 15);   //設(shè)置每個(gè)小圓點(diǎn)之間距離   if (i != 0) {    params.leftMargin = 15;   }   dotView.setLayoutParams(params);   //設(shè)置小圓點(diǎn)默認(rèn)狀態(tài)   dotView.setEnabled(false);   //把dotview加入到線性布局中   ll_dot_group.addView(dotView);  } } /**  * 定義數(shù)據(jù)適配器  */ private class ViewpagerAdapter extends PagerAdapter {  @Override  public int getCount() {   return Integer.MAX_VALUE;  }  //是否復(fù)用當(dāng)前view對象  @Override  public boolean isViewFromObject(View arg0, Object arg1) {   return arg0 == arg1;  }  //初始化每個(gè)條目要顯示的內(nèi)容  @Override  public Object instantiateItem(ViewGroup container, int position) {   //拿著position位置 % 集合.size   int newposition = position % vpLists.size();   //獲取到條目要顯示的內(nèi)容imageview   ImageView iv = vpLists.get(newposition);   //要把 iv加入到 container 中   container.addView(iv);   return iv;  }  //銷毀條目  @Override  public void destroyItem(ViewGroup container, int position, Object object) {   //移除條目   container.removeView((View) object);  } } //當(dāng)新的頁面被選中的時(shí)候調(diào)用 @Override public void onPageSelected(int position) {  //拿著position位置 % 集合.size  int newposition = position % vpLists.size();  //取出postion位置的小圓點(diǎn) 設(shè)置為true  ll_dot_group.getChildAt(newposition).setEnabled(true);  //把一個(gè)小圓點(diǎn)設(shè)置為false  ll_dot_group.getChildAt(previousPosition).setEnabled(false);  tv_img_desc.setText(imageDescArrs[newposition]);  previousPosition = newposition; } @Override protected void onDestroy() {  //當(dāng)Activity銷毀的時(shí)候 把是否切換的標(biāo)記置為true  isSwitchPager = true;  super.onDestroy(); } @Override public void onPageScrollStateChanged(int state) { } //當(dāng)頁面開始滑動(dòng) @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }}

如上我們就解決了平滑過渡的問題,關(guān)鍵的地方就是ViewpagerAdapter:

getCount方法我們返回Integer.MAX_VALUE

public int getCount() { return Integer.MAX_VALUE;}

初始化每個(gè)條目要顯示的內(nèi)容,我們拿著position位置 % 集合.size

@Overridepublic Object instantiateItem(ViewGroup container, int position) { //拿著position位置 % 集合.size int newposition = position % vpLists.size(); //獲取到條目要顯示的內(nèi)容imageview ImageView iv = vpLists.get(newposition); //要把 iv加入到 container 中 container.addView(iv); return iv;}

此時(shí)我們發(fā)現(xiàn)已經(jīng)最后一個(gè)廣告可以平滑過渡了,但是還有一個(gè)問題就是,那從第一張開始,我們往左滑呢?其實(shí)也很容易解決,就是設(shè)置第一個(gè)條目為Integer.MAX_VALUE的中間位置就可以了,我們來到initView方法中,設(shè)置當(dāng)前viewpager要顯示第幾個(gè)條目:

int item = Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2 % vpLists.size());vp.setCurrentItem(item);

問題完美解決。

用到的Shape相關(guān)資源如下:

selector_dot.xml

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/dot_enable" android:state_enabled="true"></item> <item android:drawable="@drawable/dot_normal" android:state_enabled="false"></item></selector>

dot_enable.xml

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" > <corners android:radius="5dp"/> <solid android:color="@android:color/white"/></shape>

dot_normal.xml

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" > <corners android:radius="5dp"/> <solid android:color="@android:color/darker_gray"/></shape>

來看看效果圖:

到此,一個(gè)平滑過渡的ViewPager廣告條已經(jīng)完美實(shí)現(xiàn)了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新兴县| 东方市| 临沂市| 保康县| 诸暨市| 沙洋县| 西乌珠穆沁旗| 永修县| 锡林郭勒盟| 宁晋县| 桑植县| 理塘县| 和静县| 通河县| 永清县| 长垣县| 关岭| 堆龙德庆县| 慈溪市| 峨边| 天水市| 崇文区| 吕梁市| 绥江县| 海林市| 沅陵县| 高台县| 玉山县| 镇康县| 梁河县| 民勤县| 安宁市| 凤山县| 凤凰县| 缙云县| 博湖县| 武宁县| 江达县| 蛟河市| 广水市| 时尚|