Coder Social home page Coder Social logo

bgabanner-android's Introduction

🏃BGABanner-Android🏃

目录

功能介绍

  • 引导界面导航效果
  • 支持根据服务端返回的数据动态设置广告条的总页数
  • 支持大于等于1页时的无限循环自动轮播、手指按下暂停轮播、抬起手指开始轮播
  • 支持自定义指示器位置和广告文案位置
  • 支持图片指示器和数字指示器
  • 支持 ViewPager 各种切换动画
  • 支持选中特定页面
  • 支持监听 item 点击事件
  • 加载网络数据时支持占位图设置,避免出现整个广告条空白的情况
  • 多个 ViewPager 跟随滚动

效果图与示例 apk

banner

点击下载 BGABannerDemo.apk 或扫描下面的二维码安装

BGABannerDemo apk文件二维

常见问题

  1. 结合 Fresco 加载图片请参考 FrescoDemoActivity
  2. 自定义 item 布局文件请参考 FrescoDemoActivity

使用

1.添加 Gradle 依赖

  • maven { url 'https://jitpack.io' } 添加到 root build.gradle 的 repositories 中
  • 在 app build.gradle 中添加如下依赖,末尾的「latestVersion」指的是徽章 里的版本名称,请自行替换
implementation 'androidx.legacy:legacy-support-v4:latestVersion'
implementation 'com.github.bingoogolapple:BGABanner-Android:latestVersion'

2.在布局文件中添加 BGABanner

<cn.bingoogolapple.bgabanner.BGABanner
    android:id="@+id/banner_guide_content"
    style="@style/MatchMatch"
    app:banner_pageChangeDuration="1000"
    app:banner_pointAutoPlayAble="false"
    app:banner_pointContainerBackground="@android:color/transparent"
    app:banner_pointDrawable="@drawable/bga_banner_selector_point_hollow"
    app:banner_pointTopBottomMargin="15dp"
    app:banner_transitionEffect="alpha" />

3.在 Activity 或者 Fragment 中配置 BGABanner 的数据源

有多种配置数据源的方式,这里仅列出三种方式。更多初始化方式请查看 demo

配置数据源的方式1:通过传入数据模型并结合 Adapter 的方式配置数据源。这种方式主要用于加载网络图片,以及实现少于3页时的无限轮播

mContentBanner.setAdapter(new BGABanner.Adapter<ImageView, String>() {
    @Override
    public void fillBannerItem(BGABanner banner, ImageView itemView, String model, int position) {
        Glide.with(MainActivity.this)
                .load(model)
                .placeholder(R.drawable.holder)
                .error(R.drawable.holder)
                .centerCrop()
                .dontAnimate()
                .into(itemView);
    }
});

mContentBanner.setData(Arrays.asList("网络图片路径1", "网络图片路径2", "网络图片路径3"), Arrays.asList("提示文字1", "提示文字2", "提示文字3"));

配置数据源的方式2:通过直接传入视图集合的方式配置数据源,主要用于自定义引导页每个页面布局的情况

List<View> views = new ArrayList<>();
views.add(View.inflate(context, R.layout.layout_guide_one, null));
views.add(View.inflate(context, R.layout.layout_guide_two, null));
views.add(View.inflate(context, R.layout.layout_guide_three, null));
mContentBanner.setData(views);

配置数据源的方式3:通过传入图片资源 id 的方式配置数据源,主要用于引导页每一页都是只显示图片的情况

// Bitmap 的宽高在 maxWidth maxHeight 和 minWidth minHeight 之间
BGALocalImageSize localImageSize = new BGALocalImageSize(720, 1280, 320, 640);
// 设置数据源
mContentBanner.setData(localImageSize, ImageView.ScaleType.CENTER_CROP,
        R.drawable.uoko_guide_background_1,
        R.drawable.uoko_guide_background_2,
        R.drawable.uoko_guide_background_3);

4.监听广告 item 的单击事件,在 BGABanner 里已经帮开发者处理了防止重复点击事件

mContentBanner.setDelegate(new BGABanner.Delegate<ImageView, String>() {
    @Override
    public void onBannerItemClick(BGABanner banner, ImageView itemView, String model, int position) {
        Toast.makeText(banner.getContext(), "点击了" + position, Toast.LENGTH_SHORT).show();
    }
});

5.设置「进入按钮」和「跳过按钮」控件资源 id 及其点击事件,如果进入按钮和跳过按钮有一个不存在的话就传 0,在 BGABanner 里已经帮开发者处理了防止重复点击事件,在 BGABanner 里已经帮开发者处理了「跳过按钮」和「进入按钮」的显示与隐藏

mContentBanner.setEnterSkipViewIdAndDelegate(R.id.btn_guide_enter, R.id.tv_guide_skip, new BGABanner.GuideDelegate() {
    @Override
    public void onClickEnterOrSkip() {
        startActivity(new Intent(GuideActivity.this, MainActivity.class));
        finish();
    }
});

自定义属性说明

<declare-styleable name="BGABanner">
    <!-- 指示点容器背景 -->
    <attr name="banner_pointContainerBackground" format="reference|color" />
    <!-- 指示点背景 -->
    <attr name="banner_pointDrawable" format="reference" />
    <!-- 指示点容器左右内间距 -->
    <attr name="banner_pointContainerLeftRightPadding" format="dimension" />
    <!-- 指示点上下外间距 -->
    <attr name="banner_pointTopBottomMargin" format="dimension" />
    <!-- 指示点左右外间距 -->
    <attr name="banner_pointLeftRightMargin" format="dimension" />
    <!-- 指示器的位置 -->
    <attr name="banner_indicatorGravity">
        <flag name="top" value="0x30" />
        <flag name="bottom" value="0x50" />
        <flag name="left" value="0x03" />
        <flag name="right" value="0x05" />
        <flag name="center_horizontal" value="0x01" />
    </attr>
    <!-- 是否开启自动轮播 -->
    <attr name="banner_pointAutoPlayAble" format="boolean" />
    <!-- 自动轮播的时间间隔 -->
    <attr name="banner_pointAutoPlayInterval" format="integer" />
    <!-- 页码切换过程的时间长度 -->
    <attr name="banner_pageChangeDuration" format="integer" />
    <!-- 页面切换的动画效果 -->
    <attr name="banner_transitionEffect" format="enum">
        <enum name="defaultEffect" value="0" />
        <enum name="alpha" value="1" />
        <enum name="rotate" value="2" />
        <enum name="cube" value="3" />
        <enum name="flip" value="4" />
        <enum name="accordion" value="5" />
        <enum name="zoomFade" value="6" />
        <enum name="fade" value="7" />
        <enum name="zoomCenter" value="8" />
        <enum name="zoomStack" value="9" />
        <enum name="stack" value="10" />
        <enum name="depth" value="11" />
        <enum name="zoom" value="12" />
    </attr>
    <!-- 提示文案的文字颜色 -->
    <attr name="banner_tipTextColor" format="reference|color" />
    <!-- 提示文案的文字大小 -->
    <attr name="banner_tipTextSize" format="dimension" />
    <!-- 加载网络数据时覆盖在 BGABanner 最上层的占位图 -->
    <attr name="banner_placeholderDrawable" format="reference" />
    <!-- 是否是数字指示器 -->
    <attr name="banner_isNumberIndicator" format="boolean" />
    <!-- 数字指示器文字颜色 -->
    <attr name="banner_numberIndicatorTextColor" format="reference|color" />
    <!-- 数字指示器文字大小 -->
    <attr name="banner_numberIndicatorTextSize" format="dimension" />
    <!-- 数字指示器背景 -->
    <attr name="banner_numberIndicatorBackground" format="reference" />
    <!-- 当只有一页数据时是否显示指示器,默认值为 false -->
    <attr name="banner_isNeedShowIndicatorOnOnlyOnePage" format="boolean" />
    <!-- 自动轮播区域距离 BGABanner 底部的距离,用于使指示器区域与自动轮播区域不重叠 -->
    <attr name="banner_contentBottomMargin" format="dimension"/>
    <!-- 宽高比例,如果大于 0,则会根据宽度来计算高度,否则使用 android:layout_height 指定的高度 -->
    <attr name="banner_aspectRatio" format="float"/>
    <!-- 占位图和资源图片缩放模式 -->
    <attr name="android:scaleType"/>
</declare-styleable>

代码是最好的老师,更多详细用法请查看 demo🐾

关于我

个人主页 邮箱 BGA 系列开源库 QQ 群 GitHub 喵(专注于 GitHub 等一切与程序员有关的内容)
bingoogolapple.cn [email protected] BGA_CODE_CLUB GitHub喵

打赏支持

如果您觉得 BGA 系列开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 🐵就太👍了。您的支持将鼓励我继续创作:octocat:

如果您目前正打算购买通往墙外的梯子,可以使用我的邀请码「YFQ9Q3B」购买 Lantern,双方都赠送三个月的专业版使用时间:beers:

License

Copyright 2015 bingoogolapple

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

bgabanner-android's People

Contributors

bingoogolapple avatar gitter-badger avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bgabanner-android's Issues

BGAViewPager没有addOnPageChangeListener方法

public void setViewsAndTips(List<? extends View> views, List tips) {
if (mAutoPlayAble && views.size() < 3) {
throw new IllegalArgumentException("开启指定轮播时至少有三个页面");
}
if (tips != null && tips.size() != views.size()) {
throw new IllegalArgumentException("提示文案数必须等于页面数量");
}
mViews = views;
mTips = tips;
mViewPager.setAdapter(new PageAdapter());
mViewPager.addOnPageChangeListener(new ChangePointListener());

    initPoints();
    processAutoPlay();
}

调用setViews()方法时,会报错提示没有addOnPageChangeListener方法

BGABanner做为轮播图使用

BGABanner轮播图放在首页顶部。第一次进入没问题,两次按返回键,再次进入程序,程序会ANR

如下错误

05-04 11:06:11.800 18875-18875/com.apicloud.A6984334434180 E/x_log:ViewInjectorImpl.inject(L:111): Binary XML file line #56: Error inflating class cn.bingoogolapple.bgabanner.BGABanne android.view.InflateException: Binary XML file line #56: Error inflating class cn.bingoogolapple.bgabanner.BGABanne at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:757) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at org.xutils.view.ViewInjectorImpl.inject(ViewInjectorImpl.java:107) at com.apicloud.A6984334434180.base.BaseFragment.onCreateView(BaseFragment.java:84) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:339) at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:602) at com.apicloud.A6984334434180.base.BaseFragmentActivity.onStart(BaseFragmentActivity.java:29) at com.apicloud.A6984334434180.ui.activity.HomeActivity.onStart(HomeActivity.java:166) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220) at android.app.Activity.performStart(Activity.java:5953) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.ClassNotFoundException: Didn't find class "cn.bingoogolapple.bgabanner.BGABanne" on path: DexPathList[[zip file "/data/app/com.apicloud.A6984334434180-2/base.apk"],nativeLibraryDirectories=[/data/app/com.apicloud.A6984334434180-2/lib/x86, /vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469) at android.view.LayoutInflater.createView(LayoutInflater.java:571) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)  at android.view.LayoutInflater.inflate(LayoutInflater.java:504)  at android.view.LayoutInflater.inflate(LayoutInflater.java:414)  at org.xutils.view.ViewInjectorImpl.inject(ViewInjectorImpl.java:107)  at com.apicloud.A6984334434180.base.BaseFragment.onCreateView(BaseFragment.java:84)  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)  at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:339)  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:602)  at com.apicloud.A6984334434180.base.BaseFragmentActivity.onStart(BaseFragmentActivity.java:29)  at com.apicloud.A6984334434180.ui.activity.HomeActivity.onStart(HomeActivity.java:166)  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220)  at android.app.Activity.performStart(Activity.java:5953)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)  at android.app.ActivityThread.access$800(ActivityThread.java:144)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5221)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)  Suppressed: java.lang.ClassNotFoundException: Didn't find class "cn.bingoogolapple.bgabanner.BGABanne" on path: DexPathList[[dex file "/data/data/com.apicloud.A6984334434180/files/instant-run/dex/slice-support-annotations-23.3.0_def2b22731fbd5fe0a93167c36ba1fec33805f7d-classes.dex", dex file "/data/data/com.apicloud.A6984334434180/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.apicloud.A6984334434180/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.apicloud.A6984334434180/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.apicloud.A6984334434180/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.apicloud.A6984334434180/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.apicloud.A6984334434180/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.apicloud.A6984334434180/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.apicloud.A6984334434180/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/da

每次切换,都会调用fillbanneritem重新加载图片

我想实现这个需求,就是切换图片不把view回收,防止每次切换图片重新加载会卡顿,用户体验不好。我看了以下你的代码,确实重写了ondestroyitem这个方法,并让他不调用父类回收view,确实这样写可以防止回收view,但是就搞不懂为什么fillbanneritem这方法还会调用。

轮播时间间隔

你好,轮播时间间隔,banner_pageChangeDuration,banner_pointAutoPlayInterval,这两个值我都设置过了,没起作用怎么回事,,,还有就是动画滑动几个循环后,滑动一半释放手势,这个切换效果会变得有点奇怪,,

onBannerItemClick 的model和position总是同一个

我设置数据源的方式如下:
banner.setAdapter(new HomeBannerAdapter(mContext));
banner.setOnItemClickListener(onItemClickListener);
banner.setData(R.layout.home_banner_layout,resultInfoEntities,null);
在onBannerItemClick 中,model和position总是不对,
我通过int index = banner.getCurrentItem();获取当前真正的位置,是我的
写法有问题造成的吗?

为什么接入这个库,在4.3 的手机上有出现 JNI 层错误??

错误提示为:
07-09 14:28:00.069 295-295/? I/DEBUG: #00 pc 0001a3ea /system/lib/libhwui.so
07-09 14:28:00.069 295-295/? I/DEBUG: #1 pc 0001d60d /system/lib/libhwui.so
07-09 14:28:00.069 295-295/? I/DEBUG: #2 pc 0001d6c7 /system/lib/libhwui.so
07-09 14:28:00.069 295-295/? I/DEBUG: #3 pc 0006f6cd /system/lib/libandroid_runtime.so
07-09 14:28:00.069 295-295/? I/DEBUG: #4 pc 00020c0c /system/lib/libdvm.so (dvmPlatformInvoke+112)
07-09 14:28:00.069 295-295/? I/DEBUG: #5 pc 0005178b /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const_, JValue_, Method const*,

参考网址 http://stackoverflow.com/questions/19614526/android-crash-system-lib-libhwui-so

里面有说道可能是 animationEnd 方法中调用有些函数问题,不知道题主的这个库,是否也有类似的方法;???

源码问题

在demo里面的App.java,下面代码是什么作用?需要其他依赖库吗?

@OverRide
public void onCreate() {
super.onCreate();

    sInstance = this;
    mEngine = new Retrofit.Builder()
            .baseUrl("https://raw.githubusercontent.com/bingoogolapple/BGABanner-Android/server/api/")
            .addConverterFactory(GsonConverterFactory.create())
            .build().create(Engine.class);

    Fresco.initialize(this);
}

可以支持fresco加载吗?

我想通过fresco来加载图片,但是加载的话必须使用SImpledraweeview而不是imageview,那个Adapter貌似也只能是ImageView的,有没有办法就是自定义一个item.xml,这样显示图片?

【BUG】ViewGroup﹕ addInArray been called....

D/ViewGroup﹕ addInArray been called, this = ui.banner.BGAViewPager{41cfd120 VFED.... ......ID 0,0-1280,752}call stack =
java.lang.Throwable: addInArray
at android.view.ViewGroup.addInArray(ViewGroup.java:3786)
at android.view.ViewGroup.addViewInner(ViewGroup.java:3740)
at android.view.ViewGroup.addViewInLayout(ViewGroup.java:3687)
at android.view.ViewGroup.addViewInLayout(ViewGroup.java:3668)
at android.support.v4.view.ViewPager.addView(ViewPager.java:1339)
at android.view.ViewGroup.addView(ViewGroup.java:3509)
at android.view.ViewGroup.addView(ViewGroup.java:3485)
at ui.banner.BGABanner$PageAdapter.instantiateItem(BGABanner.java:504)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:869)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1053)
at android.support.v4.view.ViewPager.populate(ViewPager.java:951)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1473)
at android.view.View.measure(View.java:16834)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:824)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:500)
at android.view.View.measure(View.java:16834)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5374)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
at android.view.View.measure(View.java:16834)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5374)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
at android.view.View.measure(View.java:16834)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5374)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:742)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:607)
at android.view.View.measure(View.java:16834)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5374)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2368)
at android.view.View.measure(View.java:16834)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2252)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1315)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1513)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1192)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6231)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788)
at android.view.Choreographer.doCallbacks(Choreographer.java:591)
at android.view.Choreographer.doFrame(Choreographer.java:560)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5333)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)

为何我集成到我的项目里,轮播会有问题,我完全按照你的DEMO来用BGABanner的啊?

我添加了三张轮播图的url,开始轮播,但是每次刚到第二张,还没有等待一点间隔时间,立马就切换到第三张了,不知道怎么回事,你的DEMO好好的啊,我只是在我的项目里作为listview的headView了啊
调用代码如下:
` BGABanner vp_view ;
vp_view = (BGABanner) headView.findViewById(R.id.vp);

vp_view.setAdapter(this);
List ads=new ArrayList<>();
List tips=new ArrayList<>();
tips.add("");
tips.add("");
tips.add("");
ads.add("http://www.pc6.com/up/2014-9/14113709517423674.jpg");
ads.add("http://pic0.mofang.com/2014/0922/20140922094300855.jpg");
ads.add("http://pic0.mofang.com/2014/1113/20141113110312116.jpg");
vp_view.setData(ads,tips);

@OverRide public void fillBannerItem(BGABanner banner, View view, Object model, int position) {
Picasso.with(getActivity())
.load((String)model)
.placeholder(R.drawable.placeholder_ad)
.into((ImageView) view);
}

xml如下: <cn.bingoogolapple.bgabanner.BGABanner
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
app:banner_indicatorGravity="center_horizontal"
app:banner_pointDrawable="@drawable/bga_banner_selector_point_solid"
app:banner_transitionEffect="stack" />`
作者求解啊,,真心觉得你这库很好,,为什么到我这里就出问题了呢,,,我昨天还给你打赏了,,帮帮我吧。。。

当view数量少于4个时,滑动抛出异常。

当view数量少于4个时,滑动抛出异常。

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:3562)
at android.view.ViewGroup.addView(ViewGroup.java:3415)
at android.support.v4.view.ViewPager.addView(ViewPager.java:1309)
at android.view.ViewGroup.addView(ViewGroup.java:3360)
at android.view.ViewGroup.addView(ViewGroup.java:3336)
at cn.bingoogolapple.bgabanner.BGABanner$MyAdapter.instantiateItem(BGABanner.java:262)

你的框架有点小Bug,看看

它自动轮播的效果很棒~但是有一个小bug:比如说它轮播到第2页的时候,我手动滑到第3页,此时在3页的它会很快就自动滑到第4页(比设定的事件要快),这个怎么解决?

三星手机点击查看ListView HeaderView Demo报java.lang.VerifyError: cn/bingoogolapple/androidcommon/adapter/BGAViewHolderHelper

java.lang.VerifyError: cn/bingoogolapple/androidcommon/adapter/BGAViewHolderHelper
at cn.bingoogolapple.androidcommon.adapter.BGAAdapterViewHolder.(BGAAdapterViewHolder.java:35)
at cn.bingoogolapple.androidcommon.adapter.BGAAdapterViewHolder.dequeueReusableAdapterViewHolder(BGAAdapterViewHolder.java:48)
at cn.bingoogolapple.androidcommon.adapter.BGAAdapterViewAdapter.getView(BGAAdapterViewAdapter.java:64)
at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:230)
at android.widget.AbsListView.obtainView(AbsListView.java:2733)
at android.widget.ListView.makeAndAddView(ListView.java:1811)
at android.widget.ListView.fillDown(ListView.java:697)
at android.widget.ListView.fillSpecific(ListView.java:1360)
at android.widget.ListView.layoutChildren(ListView.java:1619)
at android.widget.AbsListView.onLayout(AbsListView.java:2546)
at android.view.View.layout(View.java:15664)
at android.view.ViewGroup.layout(ViewGroup.java:4869)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
at android.view.View.layout(View.java:15664)
at android.view.ViewGroup.layout(ViewGroup.java:4869)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1440)
at android.view.View.layout(View.java:15664)
at android.view.ViewGroup.layout(ViewGroup.java:4869)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
at android.view.View.layout(View.java:15664)
at android.view.ViewGroup.layout(ViewGroup.java:4869)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2246)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1968)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1200)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6401)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
at android.view.Choreographer.doCallbacks(Choreographer.java:603)
at android.view.Choreographer.doFrame(Choreographer.java:573)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5335)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)

如何使用你的这个框架实现网络图片自动滚动

我想使用你的这个框架并且使用Android Universal Image Loader来加载图片,做出类似于淘宝、京东那些活动Banner,但是会报错
java.lang.ArithmeticException: divide by zero
代码如下:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        options = new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.drawable.ic_empty)
                .showImageOnFail(R.drawable.ic_error)
                .resetViewBeforeLoading(true)
                .cacheOnDisk(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .considerExifParams(true)
                .displayer(new FadeInBitmapDisplayer(300))
                .build();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_index1, container, false);
        ButterKnife.inject(this, view);

        final List<View> banners = new ArrayList<>();
        View imageLayout = LayoutInflater.from(getActivity()).inflate(R.layout.listitem_banner, container, false);
        final ImageView imageView = (ImageView) imageLayout.findViewById(R.id.imageView);

        for (int position = 0; position < imageUrls.length; position++) {
            ImageLoader.getInstance().loadImage(imageUrls[position], new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    super.onLoadingComplete(imageUri, view, loadedImage);
                    imageView.setImageBitmap(loadedImage);
                    banners.add(view);
                }
            });
        }
        banner.setViewPagerViews(banners);

        return view;
    }

[ANR Warning]onMeasure time too long

[ANR Warning]onMeasure time too long, this =xxx.xxxx.xxx.banner.BGAViewPager{41edf5b0 VFED.... ......ID 0,0-1280,752}time =95485 ms
RT...并不是经常发生,而是有时偶发...

banner用在Viewpager多个Fragment中 切换Fragment后 首次播放失去动画

我的业务场景 :
在ViewPager中每个Fragment都有一个自动播放的Banner, 当当前Fragment用户不可见时( setUserVisibleHint )我就stopBanner播放,当Fragment用户可见时我就startBanner播放。

Banner能正常如我所愿地播放与暂停,但是如果从当前页切换到别的页的时候,首次播放Banner时会没有动画直接 跳过Banner第一张图片。当Banner第二张图片开始轮播时,轮播又恢复正常有切换动画。看了很旧源码不知道哪里出问题了。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.