整合大量开源库项目(五)跳动的TextView JumpingBeans,良好体验的滚动栏ConvenientBanner

简介:

转载请注明出处:王亟亟的大牛之路

时间过得很快,这一系列已经写了第五篇了(感觉还要写好久),今天又引入了2个很好用的库JumpingBeans,ConvenientBanner.首先,先看一下效果。

这里写图片描述

1.这2个控件做了什么?

JumpingBeans是加载页面时那个蓝色跳动的动画效果。
JumpingBeans:https://github.com/frakbot/JumpingBeans

ConvenientBanner是滚动的那个广告栏。
ConvenientBanner:https://github.com/saiwu-bigkoo/Android-ConvenientBanner

2.怎么下载?

  compile 'net.frakbot:jumpingbeans:1.3.0'
  compile 'com.bigkoo:convenientbanner:1.1.4'

3.为什么要用?
TextView之类的控件的跳动可以用动画实现,甚至可以拼接多个控件然后根据运算进行位置的模拟变化,但是JumpingBeans封装的更简单,很方便我们使用。

滚动的广告栏几乎在大多数的线上产品中都有出现(诸如ViewPager+Fragment),ConvenientBanner对本地/网络的情况都做了简单实用的处理,让我们省去了换算时间,监听注册一系列重复低效的操作。


接下来我们来说下如何使用

JumpingBeans

a.还是正常的一个TextView像这样:

  <TextView
      android:id="@+id/jumpTextView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/circleProgressBar"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="20dp"
      android:text="加 载 中 。。"
      android:textColor="@color/DoderBlue"
      android:textSize="20dp" />

b.然后和往常一样findViewByIdjumpTextView = (TextView) findViewById(R.id.jumpTextView);

c.声明一个JumpingBeans 对象private JumpingBeans jumpingBeans;

d.然后对动画效果进行设置,我们来看一下怎么实现的
jumpingBeans = JumpingBeans.with(jumpTextView)
.makeTextJump(0, jumpTextView.getText().toString().indexOf(' '))
.setIsWave(true)
.setLoopDuration(800) // ms
.build();

e.把这个TextView绑定到JumpingBeans 中

  public static Builder with(@NonNull TextView textView) {
        return new Builder(textView);
    }

具体动作的哪几个字如传入(0,3)就是第1-第4个字有动画效果

   public Builder makeTextJump(int startPos, int endPos) {
            CharSequence text = textView.getText();
            ensureTextCanJump(startPos, endPos, text);

            this.text = text;
            this.wave = true;
            this.startPos = startPos;
            this.endPos = endPos;

            return this;
        }

对makeTextJump方法传入参数的检验,以保证不会start>end这种情况

    private static CharSequence ensureTextCanJump(int startPos, int endPos, CharSequence text) {
        if (text == null) {
            throw new NullPointerException("The textView text must not be null");
        }

        if (endPos < startPos) {
            throw new IllegalArgumentException("The start position must be smaller than the end position");
        }

        if (startPos < 0) {
            throw new IndexOutOfBoundsException("The start position must be non-negative");
        }

        if (endPos > text.length()) {
            throw new IndexOutOfBoundsException("The end position must be smaller than the text length");
        }
        return text;
    }

是否允许有动画

  public Builder setIsWave(boolean wave) {
            this.wave = wave;
            return this;
        }

效果持续的时间,毫秒为单位

public Builder setLoopDuration(int loopDuration) {
            if (loopDuration < 1) {
                throw new IllegalArgumentException("The loop duration must be bigger than zero");
            }
            this.loopDuration = loopDuration;
            return this;
        }

判断一系列参数,构建效果并执行(重新对TextView的字符串内容进行拼接)

   public JumpingBeans build() {
            SpannableStringBuilder sbb = new SpannableStringBuilder(text);
            JumpingBeansSpan[] spans;
            if (wave) {
                spans = getJumpingBeansSpans(sbb);
            } else {
                spans = buildSingleSpan(sbb);
            }

            textView.setText(sbb);
            return new JumpingBeans(spans, textView);
        }

f.结束时记得把开启的动画关了,不然内存泄漏你懂的,调用stopJumping()

  public void stopJumping() {
        for (JumpingBeansSpan bean : jumpingBeans) {
            if (bean != null) {
                bean.teardown();
            }
        }

        cleanupSpansFrom(textView.get());
    }

使用起来 是不是很简单?


ConvenientBanner

a.先放一个控件,只需要一个哦!一般实现的方式需要布局的ViewPager fragment之类的还要标签点的imageview等等还是蛮麻烦的。

<com.bigkoo.convenientbanner.ConvenientBanner
       android:id="@+id/convenientBanner"
       android:layout_width="match_parent"
       android:layout_height="200dp"
       app:canLoop="true"/>

b.声明private ConvenientBanner convenientBanner;

c.获取控件convenientBanner = (ConvenientBanner) findViewById(R.id.convenientBanner);

d.对具体的内容进行设置:

//自定义你的Holder,实现更多复杂的界面,不一定是图片翻页,其他任何控件翻页亦可。
convenientBanner.setPages(
                new CBViewHolderCreator<LocalImageHolderView>() {
                    @Override
                    public LocalImageHolderView createHolder() {
                        return new LocalImageHolderView();
                    }
                }, localImages)
                //设置两个点图片作为翻页指示器,不设置则没有指示器,可以根据自己需求自行配合自己的指示器,不需要圆点指示器可用不设
                .setPageIndicator(new int[]{R.drawable.ic_page_indicator, R.drawable.ic_page_indicator_focused})
                //设置指示器的方向
                .setPageIndicatorAlign(ConvenientBanner.PageIndicatorAlign.ALIGN_PARENT_RIGHT)
                //设置翻页的效果,不需要翻页效果可用不设
                .setPageTransformer(Transformer.DefaultTransformer);
//        convenientBanner.setManualPageable(false);//设置不能手动影响

public class LocalImageHolderView implements CBPageAdapter.Holder<Integer>{
    private ImageView imageView;
    @Override
    public View createView(Context context) {
        imageView = new ImageView(context);
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        return imageView;
    }

    @Override
    public void UpdateUI(Context context, final int position, Integer data) {
        imageView.setImageResource(data);
    }
}

https://github.com/saiwu-bigkoo/Android-ConvenientBanner有详细的Demo (并且,项目仍在维护当中,感谢作者https://github.com/saiwu-bigkoo)

Soyi项目代码地址:https://github.com/ddwhan0123/SoyiGit

观众老爷麻烦点个赞,谢谢你的支持

这里写图片描述

目录
相关文章
|
1月前
|
小程序
微信小程序scroll-view横向滚动和纵向滚动实现(亲测管用)
微信小程序scroll-view横向滚动和纵向滚动实现(亲测管用)
|
3月前
|
前端开发
Flutter笔记:光影动画按钮、滚动图标卡片组等
Flutter笔记:光影动画按钮、滚动图标卡片组等
40 0
|
4月前
|
XML Java Android开发
Android App开发音量调节中实现拖动条和滑动条和音频管理器AudioManager讲解及实战(超详细 附源码和演示视频)
Android App开发音量调节中实现拖动条和滑动条和音频管理器AudioManager讲解及实战(超详细 附源码和演示视频)
77 0
|
4月前
|
容器
Flutter 自定义实现时间轴、侧边进度条
时间轴和侧边进度条是非常常见的 UI 控件,它们可以增强应用的视觉效果和交互体验。在这篇文章中,我们将详细介绍如何使用 Flutter 自定义实现这两个控件。
|
定位技术 Android开发
Android仿饿了么地图滑动悬停华丽效果
Android仿饿了么地图滑动悬停华丽效果
330 0
Android仿饿了么地图滑动悬停华丽效果
|
XML Android开发 数据格式
Android5.0新特性之——按钮点击效果动画(涟漪效果)
Android5.0 Material Design设计的动画效果 RippleDrawable涟漪效果       涟漪效果是Android5.0以后的新特性。为了兼容性,建议新建drawable-v21文件夹来存放RippleDrawable,drawable文件夹下也要放相应的适配图片。
4401 0
|
Android开发
【Android视图效果】仿QQ空间滑动改变标题栏颜色
最近在倒腾公司之前的项目,发现之前的界面是个白色标题栏,不是很美观,所以做了些改进。 先看效果图 165815uykp80g8y3goo5vz.gif 简单说下思路,整个布局大体上是ScrollView里面包含了一个ImageView和RecyclerView,所以先得到ImageView的高度,当ScrollView向上滑动时,设置标题栏的背景色、文字颜色,当超过ImageView的高度时,设置其背景为白色,字体为黑色。
1132 0
|
Android开发 Java
Android 二次优化个人封装仿网易新闻可滑动标题栏
      小菜前段时间根据超多 star 的 FlycoTabLayout 自己修改封装了仿网易顶部滑动标题栏 TabSlideLayout 滑动内容可以是文字也可以是网络图标,并整理了两篇小博客: Android 优化个人封装仿网易新闻可滑动标题...
2785 0
|
Android开发
Android 优化个人封装仿网易新闻可滑动标题栏 TabLayout (文字或图标)
      小菜在向朋友推荐了自己修改封装的仿网易顶部滑动标题栏 TabSlideLayout 滑动内容可以是文字也可以是网络图标,其原型为 FlycoTabLayout,但是因为年代很久远,小菜当时技术太渣,存在一些小问题,后期做过一些优化,今天趁机会整理一下。
2999 0
|
Android开发 Kotlin 数据格式
ScrollView滑动—仿微博主页标题栏渐变悬浮及Fragment实现多个内容页面切换
作为一名热爱学习的Android开发工程si,刷微博的时候居然还想着技术呢,觉得自己也是够够了........哈哈哈 image.png 进入今天的正题,微博主页大家肯定是看过的,先看一下微博的效果。
1972 0