ViewPager圖片輪播小練習(xí)

1. 圖片輪播

學(xué)習(xí)資料:

十分感謝兩位同學(xué)

兩個(gè)同學(xué)的思路大同小異,都沒有采用將getCount()設(shè)置Integer.MAX_VALUE的常規(guī)思路瘩扼,采用原理是基本是一致的,看懂一個(gè),另外一個(gè)自然也就懂了

原理

ViewPageritem隊(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)position0時(shí)钞螟,就設(shè)置CurrentItem為原隊(duì)尾兔甘;當(dāng)positon為新隊(duì)列的最后時(shí),就設(shè)置CurrentItem1

vp.setCurrentItem(position, false)中第2個(gè)參數(shù)鳞滨,是去除動(dòng)畫效果


1.2 Activity

運(yùn)行效果

布局文件:

<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>

RelativeLayoutViewPager的布局中都使用洞焙,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í)資料

切換動(dòng)畫

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_a0.0f --> -1.0f,而page_b1.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)指出

共勉 :)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市暇藏,隨后出現(xiàn)的幾起案子蜜笤,更是在濱河造成了極大的恐慌,老刑警劉巖盐碱,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件把兔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡甸各,警方通過查閱死者的電腦和手機(jī)垛贤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趣倾,“玉大人聘惦,你說我怎么就攤上這事∪辶担” “怎么了善绎?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)诫尽。 經(jīng)常有香客問我禀酱,道長(zhǎng),這世上最難降的妖魔是什么牧嫉? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任剂跟,我火速辦了婚禮,結(jié)果婚禮上酣藻,老公的妹妹穿的比我還像新娘曹洽。我一直安慰自己,他們只是感情好辽剧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布送淆。 她就那樣靜靜地躺著,像睡著了一般怕轿。 火紅的嫁衣襯著肌膚如雪偷崩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天撞羽,我揣著相機(jī)與錄音阐斜,去河邊找鬼。 笑死诀紊,一個(gè)胖子當(dāng)著我的面吹牛智听,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼到推,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼考赛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起莉测,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤颜骤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捣卤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忍抽,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年董朝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸠项。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡子姜,死狀恐怖祟绊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哥捕,我是刑警寧澤牧抽,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站遥赚,受9級(jí)特大地震影響扬舒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凫佛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一讲坎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愧薛,春花似錦衣赶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碧磅。三九已至碘箍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲸郊,已是汗流浹背丰榴。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秆撮,地道東北人四濒。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親盗蟆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戈二,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容