android banner指示器高度,Android 广告轮播 -ConvenientBanner 指示器大小、bottomMargin,leftMarfin的修改。...
在Android開(kāi)發(fā)時(shí),廣告輪播我的項(xiàng)目是使用的ConvenientBanner 來(lái)實(shí)現(xiàn)的,效果也很好。但是有一個(gè)很嚴(yán)格的設(shè)計(jì)師,需要完全按照她的設(shè)計(jì)來(lái)實(shí)現(xiàn),突然發(fā)現(xiàn)ConvenientBanner 實(shí)現(xiàn)的指示器,不能修改bottomMargin,leftMargin,,而且也不能設(shè)置Indicator的大小。只能使用默認(rèn)的。
實(shí)現(xiàn)原理:
自定義Indicator --->隱藏ConvenientBanner的默認(rèn)Indicator-->通過(guò)ConvenientBanner的滾動(dòng)監(jiān)聽(tīng)方法來(lái)聯(lián)動(dòng)廣告圖片和Indicator
那么是不是我們需要更換框架,我是很不愿意的。然后查看ConvenientBanner 是不是有監(jiān)聽(tīng)滾動(dòng)的方法,一查果然有。
setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
LogUtils.e("onPageSelected==" + position);
//在這里面設(shè)置選中的Indicator
indicatorView.setSelectIndex(position%banners.size());
}
@Override
public void onPageScrollStateChanged(int state) {
}
}
既然有這個(gè)方法,就容易實(shí)現(xiàn)需求,自定義一個(gè)IndicatorView,通過(guò)ConvenientBanner滾動(dòng)監(jiān)聽(tīng)方法,不斷的設(shè)置選中的指示器和未選中的指示器。
IndicatorView method
該自定義的控件需要具有設(shè)置指示器個(gè)數(shù)和設(shè)置當(dāng)前選中的指示器的方法
setIndicatorCount(int count)
setIndicatorSelectIndex(int index)
IndicatorView attires
同時(shí),還需要擁有屬性如下
selectIndicatorResid——選中drawableResid
noSelectIndicatorResid——未選中drawableResid
indicatorWidhtDp——指示器寬,單位dp
indictorHeightDp——指示器高,單位dp
indicatorMarginLeft——指示器間隔,單位dp
在values/attrs下創(chuàng)建這些屬性。
IndicatorView
public class IndictorView extends LinearLayout {
private Context context;
private View view;
private LinearLayout layout;
//這些屬性全部變?yōu)樽远x屬性
private int count = 0;//指示器的數(shù)量
private int selectIndicatorResid = R.drawable.ic_indicator_circle_s;//選中時(shí)候的圖片
private int noSelectIndicatorResid = R.drawable.ic_indicator_circle_n; //未選中的時(shí)候的圖片
private int indicatorWidhtDp;//指示器的寬
private int indicatorWidhtDp_default = 7; //指示器默認(rèn)的寬 dp
private int indictorHeightDp;//指示器的高
private int indictorHeightDp_default = 7;//指示器默認(rèn)的高 dp
private int indicatorMarginLeft; //指示器MarginLeft
private int indicatorMarginLeft_default = 3;
private int beforeSelectIndex=0;
public IndictorView(Context context) {
super(context, null);
LogUtils.e("count=" + count);
this.context = context;
}
public IndictorView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
this.context = context;
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IndicatorView);
count = array.getInteger(count, R.styleable.IndicatorView_indicator_count);
selectIndicatorResid = array.getResourceId(R.styleable.IndicatorView_indicator_s_resid, R.drawable.ic_indicator_circle_s);
noSelectIndicatorResid = array.getResourceId(R.styleable.IndicatorView_indicator_n_resid, R.drawable.ic_indicator_circle_n);
indicatorWidhtDp = array.getDimensionPixelSize(R.styleable.IndicatorView_indicator_width, DisplayUtils.dp2px(context, inidicatorWidhtDp_default));
indictorHeightDp = array.getDimensionPixelSize(R.styleable.IndicatorView_indicator_width, DisplayUtils.dp2px(context, inidictorHeightDp_default));
indicatorMarginLeft = array.getDimensionPixelOffset(R.styleable.IndictorView_indicator_margin_left, DisplayUtils.dp2px(context, inidicatorMarginLeft_default));
array.recycle();
initViews();
}
public IndictorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
}
private void initViews() {
view = LayoutInflater.from(context).inflate(R.layout.widget_indicator, this);
layout = (LinearLayout) view.findViewById(R.id.widget_indicator_layout);
if (count != 0) {
setIndicatorsSize(count);
}
}
public void setIndicatorsSize(int count) {
for (int i = 0; i < count; i++) {
ImageView imageView = new ImageView(context);
imageView.setImageResource(selectIndicatorResid);
layout.addView(imageView);
LinearLayout.LayoutParams params = (LayoutParams) imageView.getLayoutParams();
params.height = indicatorWidhtDp;
params.width = indictorHeightDp;
//第一個(gè)不需要margin
if (i != 0) {
params.leftMargin = indicatorMarginLeft;
imageView.setImageResource(noSelectIndicatorResid);
}
imageView.setLayoutParams(params);
}
}
/**
* 設(shè)置選中的indicator
*
*@param index
*/
public void setSelectIndex(int index) {
ImageView imageViewbefore= (ImageView) layout.getChildAt(beforeSelectIndex);
ImageView imageViewCureent= (ImageView)layout.getChildAt(index);
if (null!=imageViewbefore)
imageViewbefore.setImageResource(noSelectIndicatorResid);
if (null!=imageViewCureent)
imageViewCureent.setImageResource(selectIndicatorResid);
beforeSelectIndex=index;
}
}
布局中的使用
android:layout_width="match_parent"
android:layout_height="@dimen/y300">
android:id="@+id/acty_main_cbanner"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:id="@+id/acty_main_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:indicator_height="@dimen/y14"
android:layout_centerHorizontal="true"
android:layout_marginBottom="@dimen/y20"
app:indicator_margin_left="@dimen/x7"
app:indicator_n_resid="@drawable/ic_indicator_circle_n"
app:indicator_s_resid="@drawable/ic_indicator_circle_s"
app:indicator_width="@dimen/y14" />
使用RelayoutLayout 來(lái)設(shè)置ConvenientBanner 和IndicatorView 對(duì)應(yīng)的位置
這里x7、y14 這是因?yàn)槠聊贿m配時(shí)使用,大家可以使用對(duì)應(yīng)的dp來(lái)設(shè)置。
Activity中ConvenientBanner 的設(shè)置
indicatorView.setIndicatorsSize(banners.size());
cBanner.setPages(new CBViewHolderCreator() {
@Override
public NetworkImageHolderView createHolder() {
return new NetworkImageHolderView();
}
}, banners)
.setPointViewVisible(false)//設(shè)置指示器是否可見(jiàn)
.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(int position) {
//dosomething
}
}).setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
LogUtils.e("onPageSelected==" + position);
//在這里面設(shè)置選中的Indicator
indictorView.setSelectIndex(position%banners.size());
}
@Override
public void onPageScrollStateChanged(int state) {
}
});//設(shè)置指示器的方向(左、中、右)
if (!cBanner.isTurning()) {
cBanner.startTurning(2000);
}
這樣我們就可以使用ConvenientBanner設(shè)定Indicator 的位置,大小,margin.
Demo github地址
總結(jié)
以上是生活随笔為你收集整理的android banner指示器高度,Android 广告轮播 -ConvenientBanner 指示器大小、bottomMargin,leftMarfin的修改。...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Real-Time-Voice-Clon
- 下一篇: 首台android手机号码,国内首批手机