自定義Banner

?Banner由圖片,標(biāo)題組成枢舶,有的還有四個點
?除了第三方的涂邀,還可以用viewpager來實現(xiàn),只需要給viewpager外面套一個容器
?原因:里面有title和viewpager2
?還有一種是自己定義一個viewgroup,滑動和監(jiān)聽(事件分發(fā))
?設(shè)置一個adapter研铆,在adapter綁定一個banner
?adapter是一個經(jīng)典模式埋同,很多地方都會用到,viewgroup棵红,recyclerview...
viewpager2支持垂直滑動凶赁,支持RTL布局,支持notifyDataSetChanged
?banner的容器是約束布局逆甜,在里面添加內(nèi)容虱肄,在onFinishInflate里面添加圖片,標(biāo)題交煞,
?先創(chuàng)建ConstrainSet的對象咏窿,將布局克隆,執(zhí)行constrainSet.clone()方法错敢,然后繪制布局翰灾,將各個方向連起來,并且給該控件設(shè)置大小addview稚茅,在該容器中添加imageview纸淮。
?在一棵view樹,ID只要在里面不重復(fù)就行亚享,在其他分支重復(fù)不影響
?初始化view就是為了把view添加進(jìn)去咽块,viewpager2,imageview欺税,textview
執(zhí)行順序:解析xml侈沪,創(chuàng)建對象,繪制布局晚凿,設(shè)置寬高亭罪,添加進(jìn)容器中,把設(shè)置好的條件用在viewpager上
?啟動倆種用法:把圖片和title的數(shù)組傳過去歼秽,或者自己提供布局
?實體類中必須有接口中的倆個方法 getImageUrl()应役,getTitle();
?adapter中創(chuàng)建onCreateViewHolder方法,直接創(chuàng)建imageview的對象燥筷,設(shè)置布局的大小箩祥,在onBindViewHolder中判斷id來添加圖片,綁定布局肆氓。
?圖片切換的時候title也會切換袍祖,所以要設(shè)置一個監(jiān)聽pager2.registerOnPageChangeCallback,在監(jiān)聽里面添加
textView.setText(mDatas.get(position%mDatas.size()).getTitle());
?滑動循環(huán):滑動到最后一頁時谢揪,無法繼續(xù)往下滑蕉陋,把count改成最大捐凭,將下標(biāo)設(shè)置為position%mDatas.size(),
?創(chuàng)建5個view凳鬓,有4個圖片柑营,當(dāng)?shù)谒膫€圖片滑出去時,第一個圖片就會進(jìn)去第五個view村视,展示出來官套;想要從banner1滑到banner4,要通過最大值item/2%data.size來判斷

?banner指示器可以用RadioGroup和RadioButton來實現(xiàn)蚁孔,還可以用自定義view來實現(xiàn)
?用RadioGroup和RadioButton來實現(xiàn)奶赔,高是圓點的直徑,長是4個圓點的直徑+間距
?banner數(shù)量不限制杠氢,指示器要設(shè)置一個最大值站刑,不能超過最大值
?指示器需要設(shè)置半徑,數(shù)量鼻百,間距绞旅,選中的顏色,未選中的顏色
?坐標(biāo):絕對坐標(biāo):相對于屏幕
相對坐標(biāo):相對于其他控件
?約束布局連線時需要id温艇,所以要寫getId
?需要在Indicator接口中定義指示器需要的屬性因悲,通過CircleIndicator繼承view實現(xiàn)這個接口,為了有這個方法勺爱,
?view中有g(shù)etId和setId方法晃琳,還要定義getId和setId方法,是為了在banner中添加到屏幕上pager.getId()
?多態(tài):用父類指向子類琐鲁,會傳不同的子類卫旱,實現(xiàn)不同的方法
new CircleIndicator(getContext());返回private Indicator mIndicator;適用于各種指示器
?用private來定義變量,不想讓別人隨意訪問的變量就用private围段,第三方的SDK顾翼,想對外暴露的用public,不想暴露的奈泪,用private
?先計算出控件的寬和高适贸,然后畫,需要畫筆段磨,要new一個paint取逾,初始化畫筆耗绿,去鋸齒(setAntiAlias(true))苹支,實心圓(setStyle(Paint.Style.FILL)),圓的顏色(setColor(Color.WHITE))误阻,在每個CircleIndicator方法里都需要初始化畫筆债蜜,半徑修改了晴埂,就會重新計算,invalidate(); 就是為了 刷新頁面寻定,使之前的無效儒洛,重新onMeasure onLayout,onDraw,
?當(dāng)它添加到window上時狼速,會計算琅锻,在onMeasure方法中,設(shè)置自己的寬和高向胡,在onDraw方法中通過畫筆繪制恼蓬。創(chuàng)建CircleIndicator對象,設(shè)置id僵芹,添加在view中addview处硬,設(shè)置約束條件,將四個方向連接起來拇派。
?要先設(shè)置指示器的數(shù)量荷辕,才能設(shè)置寬和高,否則沒有效果
?滑動圖片件豌,展示第二張圖片疮方,需要重新執(zhí)行onDraw,需要在setCurrent方法里執(zhí)行invalidate()方法
?跑馬燈效果:
textView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
textView.setSelected(true);
textView.setMarqueeRepeatLimit(-1);
textView.setSingleLine(true);
?輪播:
用handle來實現(xiàn)茧彤,停止時移除 getHandler().removeCallbacks(mLoopTask);
開始時案站, getHandler().postDelayed(mLoopTask, mInterval);
?時間較長時,會一直存在handle中棘街,導(dǎo)致內(nèi)存泄漏蟆盐,所以要移除

private Runnable mLoopTask = new Runnable() {
        @Override
        public void run() {
            int item = pager2.getCurrentItem();
            pager2.setCurrentItem(++item, true);
            getHandler().postDelayed(this, mInterval);
        }
    };

    private void stopLoop() {
        getHandler().removeCallbacks(mLoopTask);
    }

    private void startLoop() {
        if (isAutoLoop && mDatas != null && mDatas.size() > 1) {
            getHandler().postDelayed(mLoopTask, mInterval);
        }
    }

?手指觸摸屏幕時,banner不會輪播遭殉,事件分發(fā)的第一個方法dispatchTouchEvent石挂,設(shè)置監(jiān)聽MotionEvent.ACTION_DOWN
手指按下,執(zhí)行stopLoop()险污,MotionEvent.ACTION_UP手指抬起痹愚,執(zhí)行startLoop()

@Override
    protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (visibility == VISIBLE) {
            startLoop();
        } else {
            stopLoop();
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛔糯,隨后出現(xiàn)的幾起案子拯腮,更是在濱河造成了極大的恐慌,老刑警劉巖蚁飒,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件动壤,死亡現(xiàn)場離奇詭異,居然都是意外死亡淮逻,警方通過查閱死者的電腦和手機(jī)琼懊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門阁簸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哼丈,你說我怎么就攤上這事启妹。” “怎么了醉旦?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵饶米,是天一觀的道長。 經(jīng)常有香客問我车胡,道長咙崎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任吨拍,我火速辦了婚禮褪猛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羹饰。我一直安慰自己伊滋,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布队秩。 她就那樣靜靜地躺著笑旺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馍资。 梳的紋絲不亂的頭發(fā)上筒主,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音鸟蟹,去河邊找鬼乌妙。 笑死,一個胖子當(dāng)著我的面吹牛建钥,可吹牛的內(nèi)容都是我干的藤韵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熊经,長吁一口氣:“原來是場噩夢啊……” “哼泽艘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镐依,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匹涮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后槐壳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體然低,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脚翘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绍哎,死狀恐怖来农,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崇堰,我是刑警寧澤沃于,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站海诲,受9級特大地震影響繁莹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜特幔,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一咨演、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚯斯,春花似錦薄风、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至横辆,卻和暖如春撇他,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狈蚤。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工困肩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脆侮。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓僻弹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親他嚷。 傳聞我的和親對象是個殘疾皇子蹋绽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355