在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的修改。...相关推荐

  1. Android商城开发----viewPager实现广告轮播(在首页Fragment中实现)

    Android商城开发----在商城首页Fragment使用viewPager实现广告轮播 写在前面:本篇文章建立在创建底部导航栏之后,对商城首页进行开发.创建底部导航栏的内容请查看:Android开 ...

  2. android banner 广告,Android convinientbanner顶部广告轮播控件使用详解

    本文实例为大家分享了convinientbanner顶部广告轮播控件的具体代码,供大家参考,具体内容如下 gradle中添加 compile 'com.bigkoo:convenientbanner: ...

  3. android Banner 广告轮播

    看了几个Banner,代码量都不少,小巫这个算是比较少的了,流程也不算复杂 小巫的广告轮播思路 MainActivity里从上到下 handler   // 更新视图用 onCreate()  //U ...

  4. Android弧形广告图,简单封装弧形广告轮播图(ViewPager+贝塞尔曲线)

    前言 通过ViewPager和贝塞尔曲线实现了一个弧形广告轮播图. 效果图 弧形ViewPager 实现方法 想要实现这个效果,现在几行代码就可以了: Step 1. Add it in your r ...

  5. Android——开源框架Universal-Image-Loader + Fragment使用+轮播广告

    原文地址: Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用 Android 开源框架Universal-Image-Loader完全解析(二) ...

  6. Android一段时间无操作之后,进入广告轮播界面,以及触摸之后停止轮播

    想要的图片轮播Activity public class BannerMediaActivity extends AppCompatActivity implements View.OnClickLi ...

  7. Android 自动广告轮播图

    近来项目忙完了,觉得自己的自动广告轮播 蛮不错的 ,所以分享出来.先说说他的功能,第一能够实现自动轮播 图片 ,第二可以修改自动更换广告条的小点默认是圆形的 可以修改为小的正方向 ,同时 还可以修改 ...

  8. android广告轮播图之匀速规律播放

    之前在电商项目中用到广告轮播的效果,在app端实现广告图片的上传,然后轮播图片,使用handler发送消息然后在handlemessage中在发消息的循环发送可以实现广告轮播效果,但是当添加图片以后, ...

  9. android 广告轮播图片+视频+音频

    一.近期有一个需求要实现一款定制化开发的一款广告轮播视频+图片+音频的结合,来吧接下来操作起来.因为发现Viewpager 轮播的监听总会频繁调用导致体验不太好 这边是使用RecyclerView+H ...

最新文章

  1. linux 功能测试宏 POSIX_C_SOURCE
  2. Java IO流面试题
  3. 关于python django开发过程中的常见的问题及解决办法总结
  4. 华为公司参加2006 CCBN广电信息网络展览会
  5. 流量管理的7大技术流派
  6. spring常用注解使用讲解
  7. 数据通信与计算机网络参考文献,通信工程论文参考文献
  8. 数据库容灾技术之--数据容灾技术比较
  9. mysql多表join方式
  10. PCB屏蔽罩图纸制作
  11. mosefet驱动电路设计详解
  12. android模拟器+文件传输,夜神安卓模拟器怎么和电脑互传文件_夜神模拟器和电脑互传文件的教程-系统城...
  13. 统计大写字符、小写字符、数字等个数
  14. 做一个“有意思”的人
  15. 背景颜色渐变(shape属性)
  16. SQLMap使用|命令大全(干货)
  17. 我在腾讯的他我自我本我和真我
  18. Python高级:了解Python ABC(抽象基类)及 应用场景
  19. 新手指南: Linux 新手应该知道的 26 个命令
  20. 别让自己 “墙” 了自己

热门文章

  1. R语言使用马尔可夫链Markov Chain, MC来模拟抵押违约
  2. jib构建镜像(使用阿里云容器镜像服务拉取镜像)
  3. 掘金牌鸡汤 - 收藏集 - 掘金
  4. (根据关键词)查找论文的一些途径
  5. 从零开始学习NLP - 综述与论文查找指南(待更新)
  6. 微信软文的作用说到底就是营销的一种手段
  7. 绿色软件在Windows10中设置开机自启方法
  8. 滑块验证成功后,对勾对号显示为根号
  9. 【智能优化算法】改进的侏儒猫鼬优化算法(IDMO)附matlab代码
  10. 随机点名器——java