1. 圖片輪播
學(xué)習(xí)資料:
十分感謝兩位同學(xué)
兩個(gè)同學(xué)的思路大同小異,都沒有采用將getCount()
設(shè)置Integer.MAX_VALUE
的常規(guī)思路瘩扼,采用原理是基本是一致的,看懂一個(gè),另外一個(gè)自然也就懂了
在ViewPager
的item
隊(duì)列中,首先添加原隊(duì)尾鸭巴,也就是5
;然后再添加原隊(duì)首1
拦盹,最終比實(shí)際item
多出兩個(gè)
原理圖也直接拿來用了鹃祖,我實(shí)際用堅(jiān)果手機(jī)測(cè)試,這種方式帶來的優(yōu)化效果比設(shè)置 Integer.MAX_VALUE
方式幾乎可以忽略普舆。占用內(nèi)存相差不大恬口,使用這種方式校读,循環(huán)多次時(shí),占用內(nèi)存增長(zhǎng)速度感覺稍微慢一點(diǎn)點(diǎn)祖能。個(gè)人感覺歉秫,性能方面兩種方式基本是一樣的。但這種方式养铸,更符合真正的循環(huán)輪播吧
1.1 BannerAdapter
主要是startUpdate()
方法的重寫
public class BannerAdapter extends PagerAdapter {
private List<String> imageViews = new ArrayList<>();
private int bannerSize;
@Override
public int getCount() {
bannerSize = imageViews.size();
return bannerSize;
}
public void setImageViews(List<String> imageViews) {
this.imageViews.addAll(imageViews);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView = new ImageView(container.getContext());
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
String url = imageViews.get(position);
Glide.with(container.getContext()).load(url).into(imageView);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public void startUpdate(ViewGroup container) {
ViewPager vp = (ViewPager) container;
int position = vp.getCurrentItem();
if (position == 0) {
position = bannerSize - 2;
vp.setCurrentItem(position, false);
} else if (position == (bannerSize - 1)) {
position = 1;
vp.setCurrentItem(position, false);
}
}
}
在startUpdate()
方法中雁芙,根據(jù)滑動(dòng)到的當(dāng)前的position
來確定最終的CurrentItem
。當(dāng)position
為0
時(shí)钞螟,就設(shè)置CurrentItem
為原隊(duì)尾兔甘;當(dāng)positon
為新隊(duì)列的最后時(shí),就設(shè)置CurrentItem
為1
vp.setCurrentItem(position, false)
中第2個(gè)參數(shù)鳞滨,是去除動(dòng)畫效果
1.2 Activity
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false">
<android.support.v4.view.ViewPager
android:id="@+id/banner_activity_vp"
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_centerInParent="true"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:clipChildren="false" />
</RelativeLayout>
RelativeLayout
和ViewPager
的布局中都使用洞焙,android:clipChildren="false"
,主要是為了讓ViewPager
一屏幕可以顯示多個(gè)item
拯啦,顯示多少則由android:layout_marginLeft
這個(gè)系列的屬性控制
Activity代碼:
public class BannerActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_banner);
initView();
}
private void initView() {
List<String> imageViews = new ArrayList<>();
imageViews.add(Urls.IMG_URL3);//添加隊(duì)尾
imageViews.add(Urls.IMG_URL1);
imageViews.add(Urls.IMG_URL2);
imageViews.add(Urls.IMG_URL3);
imageViews.add(Urls.IMG_URL1);//添加隊(duì)首
ViewPager vp = (ViewPager) findViewById(R.id.banner_activity_vp);
BannerAdapter adapter = new BannerAdapter();
vp.setPageMargin(10);
adapter.setImageViews(imageViews);
vp.setOffscreenPageLimit(3);
vp.setAdapter(adapter);
vp.setCurrentItem(1);//顯示img_url_1
}
}
在imageViews
中澡匪,多添加了兩個(gè)img_url
,由于添加了一個(gè)新的隊(duì)首褒链,設(shè)置vp.setCurrentItem(1)
2. 切換動(dòng)畫
學(xué)習(xí)資料
2.1 BannerTransformer
public class BannerTransformer implements ViewPager.PageTransformer {
private static final float MAX_SCALE = 1.0f;
private static final float MIN_SCALE = 0.8f;
@Override
public void transformPage(View page, float position) {
if (position < -1) {//(-Infinity,-1)
page.setScaleX(MIN_SCALE);
page.setScaleY(MIN_SCALE);
} else if (position <= 0) {//[-1,0]
float scaleFactor = MIN_SCALE+(1-Math.abs(position))*(MAX_SCALE-MIN_SCALE);
page.setScaleX(scaleFactor);
page.setScaleY(scaleFactor);
} else if (position <= 1) {//(0,1]
float scaleFactor = MIN_SCALE+(1-Math.abs(position))*(MAX_SCALE-MIN_SCALE);
page.setScaleX(scaleFactor);
page.setScaleY(scaleFactor);
} else {//(1,Infinity)
page.setScaleX(MIN_SCALE);
page.setScaleY(MIN_SCALE);
}
}
}
切換動(dòng)畫使用vp.setPageTransformer(true, new BannerTransformer())
動(dòng)畫就涉及到了一個(gè)縮放效果
一個(gè)page的position為0代表它處于中間仙蛉,為1代表它完全處于右邊,為-1代表它完全處于左邊
由page_a
切換到page_b
碱蒙,page_a
從0.0f --> -1.0f
,而page_b
從1.0f --> 0.0f
2.2 問題
遇到一個(gè)坑夯巷,查了一個(gè)多小時(shí)赛惩,暫時(shí)也沒有考慮出到底啥原因
一開始在BannerAdapter
中,重寫的是finshUpdate()
趁餐,右滑沒有問題喷兼,左滑遇到一個(gè)問題
手指從右側(cè)向左滑時(shí),3個(gè)page
每循環(huán)一次后后雷,就會(huì)出現(xiàn)問題季惯,左面的page
會(huì)閃一下,然后大小變成原始的正常大小臀突,設(shè)置的縮放效果無效
將BannerAdapter
中的finshUpdate()
改為startUpdata()
方法后勉抓,就好了
若使用設(shè)置Integer.MAX_VALUE
的方式,使用同一個(gè)切換動(dòng)畫候学,沒有任何問題藕筋。
3. 最后
臘月二十九,2016梳码,馬上就真的過去了隐圾,新年新氣象
有錯(cuò)誤伍掀,請(qǐng)指出
共勉 :)