高效可點(diǎn)擊的輪播圖

//輪播圖控件

packagecn.mohekeji.xiangshan.common.widget;

importandroid.content.Context;

importandroid.content.res.TypedArray;

importandroid.graphics.drawable.Drawable;

importandroid.graphics.drawable.GradientDrawable;

importandroid.graphics.drawable.LayerDrawable;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.support.annotation.NonNull;

importandroid.support.v4.view.PagerAdapter;

importandroid.support.v4.view.ViewPager;

importandroid.util.AttributeSet;

importandroid.view.Gravity;

importandroid.view.MotionEvent;

importandroid.view.View;

importandroid.view.ViewGroup;

importandroid.view.animation.Interpolator;

importandroid.widget.ImageView;

importandroid.widget.LinearLayout;

importandroid.widget.RelativeLayout;

importandroid.widget.Scroller;

importjava.lang.reflect.Field;

importjava.util.ArrayList;

importjava.util.List;

importcn.mohekeji.xiangshan.R;

importcn.mohekeji.xiangshan.common.net.VolleyManager;

/**

* Created by Apple on 16/7/6.

*/

public classBannerLayoutextendsRelativeLayout {

privateViewPagerpager;

//指示器容器

privateLinearLayoutindicatorContainer;

privateDrawableunSelectedDrawable;

privateDrawableselectedDrawable;

private intWHAT_AUTO_PLAY=1000;

private booleanisAutoPlay=true;

private intitemCount;

private intselectedIndicatorColor=0xffff0000;

private intunSelectedIndicatorColor=0x88888888;

privateShapeindicatorShape= Shape.oval;

private intselectedIndicatorHeight=6;

private intselectedIndicatorWidth=6;

private intunSelectedIndicatorHeight=6;

private intunSelectedIndicatorWidth=6;

privatePositionindicatorPosition= Position.centerBottom;

private intautoPlayDuration=4000;

private intscrollDuration=900;

private intindicatorSpace=3;

private intindicatorMargin=10;

private intdefaultImage;

private enumShape {

rect,oval

}

private enumPosition {

centerBottom,

rightBottom,

leftBottom,

centerTop,

rightTop,

leftTop

}

privateOnBannerItemClickListeneronBannerItemClickListener;

privateHandlerhandler=newHandler(newHandler.Callback() {

@Override

public booleanhandleMessage(Message msg) {

if(msg.what==WHAT_AUTO_PLAY) {

if(pager!=null) {

pager.setCurrentItem(pager.getCurrentItem() +1,true);

handler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY,autoPlayDuration);

}

}

return false;

}

});

publicBannerLayout(Context context) {

super(context);

init(null,0);

}

publicBannerLayout(Context context, AttributeSet attrs) {

super(context, attrs);

init(attrs,0);

}

publicBannerLayout(Context context, AttributeSet attrs,intdefStyleAttr) {

super(context, attrs, defStyleAttr);

init(attrs, defStyleAttr);

}

private voidinit(AttributeSet attrs,intdefStyle) {

TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.BannerLayoutStyle, defStyle,0);

selectedIndicatorColor= array.getColor(R.styleable.BannerLayoutStyle_selectedIndicatorColor,selectedIndicatorColor);

unSelectedIndicatorColor= array.getColor(R.styleable.BannerLayoutStyle_unSelectedIndicatorColor,unSelectedIndicatorColor);

intshape = array.getInt(R.styleable.BannerLayoutStyle_indicatorShape, Shape.oval.ordinal());

for(Shape shape1 : Shape.values()) {

if(shape1.ordinal() == shape) {

indicatorShape= shape1;

break;

}

}

selectedIndicatorHeight= (int) array.getDimension(R.styleable.BannerLayoutStyle_selectedIndicatorHeight,selectedIndicatorHeight);

selectedIndicatorWidth= (int) array.getDimension(R.styleable.BannerLayoutStyle_selectedIndicatorWidth,selectedIndicatorWidth);

unSelectedIndicatorHeight= (int) array.getDimension(R.styleable.BannerLayoutStyle_unSelectedIndicatorHeight,unSelectedIndicatorHeight);

unSelectedIndicatorWidth= (int) array.getDimension(R.styleable.BannerLayoutStyle_unSelectedIndicatorWidth,unSelectedIndicatorWidth);

intposition = array.getInt(R.styleable.BannerLayoutStyle_indicatorPosition, Position.centerBottom.ordinal());

for(Position position1 : Position.values()) {

if(position == position1.ordinal()) {

indicatorPosition= position1;

}

}

indicatorSpace= (int) array.getDimension(R.styleable.BannerLayoutStyle_indicatorSpace,indicatorSpace);

indicatorMargin= (int) array.getDimension(R.styleable.BannerLayoutStyle_indicatorMargin,indicatorMargin);

autoPlayDuration= array.getInt(R.styleable.BannerLayoutStyle_autoPlayDuration,autoPlayDuration);

scrollDuration= array.getInt(R.styleable.BannerLayoutStyle_scrollDuration,scrollDuration);

isAutoPlay= array.getBoolean(R.styleable.BannerLayoutStyle_isAutoPlay,isAutoPlay);

defaultImage= array.getResourceId(R.styleable.BannerLayoutStyle_defaultImage,defaultImage);

array.recycle();

//繪制未選中狀態(tài)圖形

LayerDrawable unSelectedLayerDrawable;

LayerDrawable selectedLayerDrawable;

GradientDrawable unSelectedGradientDrawable;

unSelectedGradientDrawable =newGradientDrawable();

//繪制選中狀態(tài)圖形

GradientDrawable selectedGradientDrawable;

selectedGradientDrawable =newGradientDrawable();

switch(indicatorShape) {

caserect:

unSelectedGradientDrawable.setShape(GradientDrawable.RECTANGLE);

selectedGradientDrawable.setShape(GradientDrawable.RECTANGLE);

break;

caseoval:

unSelectedGradientDrawable.setShape(GradientDrawable.OVAL);

selectedGradientDrawable.setShape(GradientDrawable.OVAL);

break;

}

unSelectedGradientDrawable.setColor(unSelectedIndicatorColor);

unSelectedGradientDrawable.setSize(unSelectedIndicatorWidth,unSelectedIndicatorHeight);

unSelectedLayerDrawable =newLayerDrawable(newDrawable[]{unSelectedGradientDrawable});

unSelectedDrawable= unSelectedLayerDrawable;

selectedGradientDrawable.setColor(selectedIndicatorColor);

selectedGradientDrawable.setSize(selectedIndicatorWidth,selectedIndicatorHeight);

selectedLayerDrawable =newLayerDrawable(newDrawable[]{selectedGradientDrawable});

selectedDrawable= selectedLayerDrawable;

}

//添加本地圖片路徑

public voidsetViewRes(List viewRes) {

List views =newArrayList<>();

itemCount= viewRes.size();

//主要是解決當(dāng)item為小于3個的時候滑動有問題瘩蚪,這里將其拼湊成3個以上

if(itemCount<1) {//當(dāng)item個數(shù)0

throw newIllegalStateException("item count not equal zero");

}else if(itemCount<2) {//當(dāng)item個數(shù)為1

views.add(getImageView(viewRes.get(0),0));

views.add(getImageView(viewRes.get(0),0));

views.add(getImageView(viewRes.get(0),0));

}else if(itemCount<3) {//當(dāng)item個數(shù)為2

views.add(getImageView(viewRes.get(0),0));

views.add(getImageView(viewRes.get(1),1));

views.add(getImageView(viewRes.get(0),0));

views.add(getImageView(viewRes.get(1),1));

}else{

for(inti =0; i < viewRes.size(); i++) {

views.add(getImageView(viewRes.get(i), i));

}

}

setViews(views);

}

@NonNull

privateImageView getImageView(Integer res,final intposition) {

ImageView imageView =newImageView(getContext());

imageView.setOnClickListener(newOnClickListener() {

@Override

public voidonClick(View v) {

if(onBannerItemClickListener!=null) {

onBannerItemClickListener.onItemClick(position);

}

}

});

imageView.setScaleType(ImageView.ScaleType.FIT_XY);

VolleyManager.getInstance().loadImage(res.toString(), imageView);

returnimageView;

}

//添加網(wǎng)絡(luò)圖片路徑

public voidsetViewUrls(List urls) {

List views =newArrayList<>();

itemCount= urls.size();

//主要是解決當(dāng)item為小于3個的時候滑動有問題,這里將其拼湊成3個以上

if(itemCount<1) {//當(dāng)item個數(shù)0

throw newIllegalStateException("item count not equal zero");

}else if(itemCount<2) {//當(dāng)item個數(shù)為1

views.add(getImageView(urls.get(0),0));

views.add(getImageView(urls.get(0),0));

views.add(getImageView(urls.get(0),0));

}else if(itemCount<3) {//當(dāng)item個數(shù)為2

views.add(getImageView(urls.get(0),0));

views.add(getImageView(urls.get(1),1));

views.add(getImageView(urls.get(0),0));

views.add(getImageView(urls.get(1),1));

}else{

for(inti =0; i < urls.size(); i++) {

views.add(getImageView(urls.get(i), i));

}

}

setViews(views);

}

@NonNull

privateImageView getImageView(String url,final intposition) {

ImageView imageView =newImageView(getContext());

imageView.setScaleType(ImageView.ScaleType.FIT_XY);

imageView.setOnClickListener(newOnClickListener() {

@Override

public voidonClick(View v) {

if(onBannerItemClickListener!=null) {

onBannerItemClickListener.onItemClick(position);

}

}

});

imageView.setScaleType(ImageView.ScaleType.FIT_XY);

if(defaultImage!=0) {

VolleyManager.getInstance().loadImage(url.toString(), imageView);

}else{

VolleyManager.getInstance().loadImage(url.toString(), imageView);

}

returnimageView;

}

//添加任意View視圖

private voidsetViews(finalList views) {

//初始化pager

pager=newViewPager(getContext());

//添加viewpager到SliderLayout

addView(pager);

setSliderTransformDuration(scrollDuration);

//初始化indicatorContainer

indicatorContainer=newLinearLayout(getContext());

indicatorContainer.setGravity(Gravity.CENTER_VERTICAL);

RelativeLayout.LayoutParams params =newLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

switch(indicatorPosition) {

casecenterBottom:

params.addRule(RelativeLayout.CENTER_HORIZONTAL);

params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

break;

casecenterTop:

params.addRule(RelativeLayout.CENTER_HORIZONTAL);

params.addRule(RelativeLayout.ALIGN_PARENT_TOP);

break;

caseleftBottom:

params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

break;

caseleftTop:

params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

params.addRule(RelativeLayout.ALIGN_PARENT_TOP);

break;

caserightBottom:

params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

break;

caserightTop:

params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

params.addRule(RelativeLayout.ALIGN_PARENT_TOP);

break;

}

//設(shè)置margin

params.setMargins(indicatorMargin,indicatorMargin,indicatorMargin,indicatorMargin);

//添加指示器容器布局到SliderLayout

addView(indicatorContainer, params);

//初始化指示器,并添加到指示器容器布局

for(inti =0; i

ImageView indicator =newImageView(getContext());

indicator.setLayoutParams(newViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

indicator.setPadding(indicatorSpace,indicatorSpace,indicatorSpace,indicatorSpace);

indicator.setImageDrawable(unSelectedDrawable);

indicatorContainer.addView(indicator);

}

LoopPagerAdapter pagerAdapter =newLoopPagerAdapter(views);

pager.setAdapter(pagerAdapter);

//設(shè)置當(dāng)前item到Integer.MAX_VALUE中間的一個值,看起來像無論是往前滑還是往后滑都是ok的

//如果不設(shè)置,用戶往左邊滑動的時候已經(jīng)劃不動了

inttargetItemPosition = Integer.MAX_VALUE/2- Integer.MAX_VALUE/2%itemCount;

pager.setCurrentItem(targetItemPosition);

switchIndicator(targetItemPosition %itemCount);

pager.addOnPageChangeListener(newViewPager.SimpleOnPageChangeListener() {

@Override

public voidonPageSelected(intposition) {

switchIndicator(position %itemCount);

}

});

startAutoPlay();

}

public voidsetSliderTransformDuration(intduration) {

try{

Field mScroller = ViewPager.class.getDeclaredField("mScroller");

mScroller.setAccessible(true);

FixedSpeedScroller scroller =newFixedSpeedScroller(pager.getContext(),null, duration);

mScroller.set(pager, scroller);

}catch(Exception e) {

e.printStackTrace();

}

}

/**

* 開始自動輪播

*/

public voidstartAutoPlay() {

stopAutoPlay();// 避免重復(fù)消息

if(isAutoPlay) {

handler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY,autoPlayDuration);

}

}

@Override

protected voidonWindowVisibilityChanged(intvisibility) {

super.onWindowVisibilityChanged(visibility);

if(visibility ==VISIBLE) {

startAutoPlay();

}else{

stopAutoPlay();

}

}

/**

* 停止自動輪播

*/

public voidstopAutoPlay() {

if(isAutoPlay) {

handler.removeMessages(WHAT_AUTO_PLAY);

}

}

@Override

public booleandispatchTouchEvent(MotionEvent ev) {

switch(ev.getAction()) {

caseMotionEvent.ACTION_DOWN:

stopAutoPlay();

break;

caseMotionEvent.ACTION_CANCEL:

caseMotionEvent.ACTION_UP:

startAutoPlay();

break;

}

return super.dispatchTouchEvent(ev);

}

/**

* 切換指示器狀態(tài)

*

*@paramcurrentPosition當(dāng)前位置

*/

private voidswitchIndicator(intcurrentPosition) {

for(inti =0; i

((ImageView)indicatorContainer.getChildAt(i)).setImageDrawable(i == currentPosition ?selectedDrawable:unSelectedDrawable);

}

}

public voidsetOnBannerItemClickListener(OnBannerItemClickListener onBannerItemClickListener) {

this.onBannerItemClickListener= onBannerItemClickListener;

}

public interfaceOnBannerItemClickListener {

voidonItemClick(intposition);

}

public classLoopPagerAdapterextendsPagerAdapter {

privateListviews;

publicLoopPagerAdapter(List views) {

this.views= views;

}

@Override

public intgetCount() {

//Integer.MAX_VALUE = 2147483647

returnInteger.MAX_VALUE;

}

@Override

public booleanisViewFromObject(View view, Object object) {

returnview == object;

}

@Override

publicObject instantiateItem(ViewGroup container,intposition) {

if(views.size() >0) {

//position % view.size()是指虛擬的position會在[0荤堪,view.size())之間循環(huán)

View view =views.get(position %views.size());

if(container.equals(view.getParent())) {

container.removeView(view);

}

container.addView(view);

returnview;

}

return null;

}

@Override

public voiddestroyItem(ViewGroup container,intposition, Object object) {

}

}

public classFixedSpeedScrollerextendsScroller {

private intmDuration=1000;

publicFixedSpeedScroller(Context context) {

super(context);

}

publicFixedSpeedScroller(Context context, Interpolator interpolator) {

super(context, interpolator);

}

publicFixedSpeedScroller(Context context, Interpolator interpolator,intduration) {

this(context, interpolator);

mDuration= duration;

}

@Override

public voidstartScroll(intstartX,intstartY,intdx,intdy,intduration) {

// Ignore received duration, use fixed one instead

super.startScroll(startX, startY, dx, dy,mDuration);

}

@Override

public voidstartScroll(intstartX,intstartY,intdx,intdy) {

// Ignore received duration, use fixed one instead

super.startScroll(startX, startY, dx, dy,mDuration);

}

}

}

//放置圖片URL的集合

privateArrayListimagesList;

//放置圖片

BannerLayoutbanner;

viewFlow2.setViewUrls(imageList);

//點(diǎn)擊事件

banner.setOnBannerItemClickListener(newBannerLayout.OnBannerItemClickListener() {

@Override

public voidonItemClick(intposition) {

RecommendArticalDetailData recommendArticalDetailData = (RecommendArticalDetailData)recommend.get(position);

String ImagesType=recommendArticalDetailData.getType();

if(ImagesType.equals("0")){

Intent intent =newIntent(getActivity(), HealthyInforDetailActivity.class);

intent.putExtra("scienceId", recommendArticalDetailData.getScienceId());

intent.putExtra("thumbUrl", recommendArticalDetailData.getRecommendThumbnailUrl());

getActivity().startActivity(intent);

}else{

Intent intent =newIntent(getActivity(), LineCourseDetailActivity.class);

intent.putExtra("curriculumId", recommendArticalDetailData.getScienceId());

getActivity().startActivity(intent);

}

}

});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酌摇,更是在濱河造成了極大的恐慌,老刑警劉巖嗡载,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窑多,死亡現(xiàn)場離奇詭異,居然都是意外死亡鼻疮,警方通過查閱死者的電腦和手機(jī)怯伊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來判沟,“玉大人耿芹,你說我怎么就攤上這事∨埠澹” “怎么了吧秕?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迹炼。 經(jīng)常有香客問我砸彬,道長,這世上最難降的妖魔是什么斯入? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任砂碉,我火速辦了婚禮,結(jié)果婚禮上刻两,老公的妹妹穿的比我還像新娘增蹭。我一直安慰自己,他們只是感情好磅摹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布滋迈。 她就那樣靜靜地躺著霎奢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饼灿。 梳的紋絲不亂的頭發(fā)上幕侠,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音碍彭,去河邊找鬼晤硕。 笑死,一個胖子當(dāng)著我的面吹牛硕旗,可吹牛的內(nèi)容都是我干的窗骑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼漆枚,長吁一口氣:“原來是場噩夢啊……” “哼创译!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起墙基,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤软族,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后残制,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體立砸,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年初茶,在試婚紗的時候發(fā)現(xiàn)自己被綠了颗祝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡恼布,死狀恐怖螺戳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情折汞,我是刑警寧澤倔幼,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站爽待,受9級特大地震影響损同,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸟款,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一膏燃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧何什,春花似錦组哩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霍比,卻和暖如春幕袱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悠瞬。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工们豌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浅妆。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓望迎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凌外。 傳聞我的和親對象是個殘疾皇子辩尊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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