android banner指示器高度,Android 广告轮播 -ConvenientBanner 指示器大小、bottomMargin,leftMarfin的修改。...
在Android開發時,廣告輪播我的項目是使用的ConvenientBanner 來實現的,效果也很好。但是有一個很嚴格的設計師,需要完全按照她的設計來實現,突然發現ConvenientBanner 實現的指示器,不能修改bottomMargin,leftMargin,,而且也不能設置Indicator的大小。只能使用默認的。
實現原理:
自定義Indicator --->隱藏ConvenientBanner的默認Indicator-->通過ConvenientBanner的滾動監聽方法來聯動廣告圖片和Indicator
那么是不是我們需要更換框架,我是很不愿意的。然后查看ConvenientBanner 是不是有監聽滾動的方法,一查果然有。
setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
LogUtils.e("onPageSelected==" + position);
//在這里面設置選中的Indicator
indicatorView.setSelectIndex(position%banners.size());
}
@Override
public void onPageScrollStateChanged(int state) {
}
}
既然有這個方法,就容易實現需求,自定義一個IndicatorView,通過ConvenientBanner滾動監聽方法,不斷的設置選中的指示器和未選中的指示器。
IndicatorView method
該自定義的控件需要具有設置指示器個數和設置當前選中的指示器的方法
setIndicatorCount(int count)
setIndicatorSelectIndex(int index)
IndicatorView attires
同時,還需要擁有屬性如下
selectIndicatorResid——選中drawableResid
noSelectIndicatorResid——未選中drawableResid
indicatorWidhtDp——指示器寬,單位dp
indictorHeightDp——指示器高,單位dp
indicatorMarginLeft——指示器間隔,單位dp
在values/attrs下創建這些屬性。
IndicatorView
public class IndictorView extends LinearLayout {
private Context context;
private View view;
private LinearLayout layout;
//這些屬性全部變為自定義屬性
private int count = 0;//指示器的數量
private int selectIndicatorResid = R.drawable.ic_indicator_circle_s;//選中時候的圖片
private int noSelectIndicatorResid = R.drawable.ic_indicator_circle_n; //未選中的時候的圖片
private int indicatorWidhtDp;//指示器的寬
private int indicatorWidhtDp_default = 7; //指示器默認的寬 dp
private int indictorHeightDp;//指示器的高
private int indictorHeightDp_default = 7;//指示器默認的高 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;
//第一個不需要margin
if (i != 0) {
params.leftMargin = indicatorMarginLeft;
imageView.setImageResource(noSelectIndicatorResid);
}
imageView.setLayoutParams(params);
}
}
/**
* 設置選中的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 來設置ConvenientBanner 和IndicatorView 對應的位置
這里x7、y14 這是因為屏幕適配時使用,大家可以使用對應的dp來設置。
Activity中ConvenientBanner 的設置
indicatorView.setIndicatorsSize(banners.size());
cBanner.setPages(new CBViewHolderCreator() {
@Override
public NetworkImageHolderView createHolder() {
return new NetworkImageHolderView();
}
}, banners)
.setPointViewVisible(false)//設置指示器是否可見
.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);
//在這里面設置選中的Indicator
indictorView.setSelectIndex(position%banners.size());
}
@Override
public void onPageScrollStateChanged(int state) {
}
});//設置指示器的方向(左、中、右)
if (!cBanner.isTurning()) {
cBanner.startTurning(2000);
}
這樣我們就可以使用ConvenientBanner設定Indicator 的位置,大小,margin.
Demo github地址
總結
以上是生活随笔為你收集整理的android banner指示器高度,Android 广告轮播 -ConvenientBanner 指示器大小、bottomMargin,leftMarfin的修改。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Real-Time-Voice-Clon
- 下一篇: CTB词性标注集