android 滑动固定标题,Android 优化个人封装仿网易新闻可滑动标题栏 TabLayout (文字或图标)...

和尚我向朋友推荐了自己修改封装的仿网易顶部滑动标题栏 TabSlideLayout 滑动内容可以是文字也可以是网络图标,其原型为 FlycoTabLayout,但是因为年代很久远,和尚我当时技术太渣,存在一些小问题,后期做过一些优化,今天趁机会整理一下。

优化内容:

网络状态不佳情况下,图片加载缓慢,有时加载不出来,如下图:

在部分三星手机上展示效果不佳,图片显示很小,如下图:

06160fb4247d3a7c93a59c6192163999.png

3. 可以动态设置图片是否绘色,因有个别需求用户要展示的是彩色的漂亮图标,强制绘色便是画蛇添足。

问题查找:

问题一 的出现主要是因为图片加载方式不太合理,和尚我以前用的是 Glide 中 BitmapImageViewTarget(iv) 方式,现在更换为 SimpleTarget

() 方式,两者的区别和尚我还不能简洁明了的说清楚,有兴趣的朋友可以详细查看一下源码。

和尚我的理解是,BitmapImageViewTarget() 方式优点:对于加载大图的整个过程处理比较好,可以设置加载过程中进度条等展示效果;而且该方式可以加载 Gif 图,也可以对 Gif 图的第一帧图进行绘色,但是没有 Gif 动画效果,就像一张普通的 png 图;缺点则是整体的处理时间较长,在网络状态不佳情况下有可能会加载失败。SimpleTarget() 方式直接优点是图片加载速度快,图片的大小根据 ImagView 来决定,不用重新计算;缺点是直接返回的 Bitmap() 不能加载 Gif 图。综合考虑,和尚我觉得 SimpleTarget() 方式较合适。

问题二 的出现主要针对不同手机的适配,问题同样出在 Glide 图片加载部分,以前和尚用的 BitmapImageViewTarget() 并计算图片的宽高,现更改为 SimpleTarget() 方式解决。

问题三 的出现只是因为当时考虑不周全,可以在 attrs 中添加一个属性 is_change_color,并在图片绘色过程中处理一下即可,同时设置 set/get 方法,可以根据业务需求动态修改,详情请直接跳转 源码 Demo。

Tips:针对于问题二,图片布局中 ImageView 建议设置为 match_parent 方式,因为我们用户觉得 wrap_content 方式在部分三星手机上图不如华为手机大,小纠结。

b493da77b5a0dca9372648109cdf028d.png

解决方案:

Glide 加载方式更换为 SimpleTarget(),如下:

Glide.with(mContext).load(title).asBitmap()

.placeholder(R.mipmap.top_default_bg).diskCacheStrategy(DiskCacheStrategy.SOURCE)

.into(new SimpleTarget() {

@Override

public void onResourceReady(Bitmap resource, GlideAnimation super Bitmap> glideAnimation){

if (mChangeColor) {

resource = BitmapUtil.tintBitmap(resource, (position == 0) ? mTextSelectColor : mTextUnselectColor);

}

iv_tab_title.setImageBitmap(resource);

}

});

在 attrs 中添加是否绘制图片颜色的属性,可以在 xml 或 Java 代码中进行设置:

mChangeColor = ta.getBoolean(R.styleable.SlidingTabLayout_tl_is_change_color, true);

public boolean isChangeColor(){

return mChangeColor;

}

public void setChangeColor(boolean mChangeColor){

this.mChangeColor = mChangeColor;

}

bb73d256d2073da614815e12fa976423.png

41f5d5ff396f2a9320c881e9e570afc7.png

和尚认为,优化是一个漫长的过程,是随着经验的积累与实际效果的反馈共同进行的,在使用过程中发现不合理的地方还请各位多多指教。

下面的是和尚的公众号,欢迎闲来吐槽哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!针对您的问题,您可以使用 Android 中的 Toolbar 控件来实现滑动渐变标题栏。 具体实现步骤如下: 1. 在布局文件中添加 Toolbar 控件,并设置其高度为 wrap_content。 2. 在代码中通过 findViewById 获取 Toolbar 对象,并调用 setSupportActionBar 方法将其设置为当前 Activity 的 ActionBar。 3. 在 Activity 的 onCreate 方法中,通过 getSupportActionBar().setDisplayHomeAsUpEnabled(true) 设置标题栏左侧显示返回按钮。 4. 在滑动时,通过监听 RecyclerView 的滚动事件,动态改变标题栏的背景颜色和透明度,实现滑动渐变效果。 5. 在 onScrollStateChanged 方法中,根据当前滚动状态判断是否需要执行动画效果。 下面是一个简单的示例代码: ```java // 获取 Toolbar 对象 Toolbar toolbar = findViewById(R.id.toolbar); // 将 Toolbar 设置为当前 Activity 的 ActionBar setSupportActionBar(toolbar); // 显示返回按钮 getSupportActionBar().setDisplayHomeAsUpEnabled(true); // 监听 RecyclerView 的滚动事件 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { // 滑动停止时执行动画效果 animateToolbarColor(0xFF0000FF, 0x00000000); } } @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); // 获取当前 RecyclerView 的滚动位置 int scrollY = recyclerView.computeVerticalScrollOffset(); // 计算标题栏透明度 int alpha = Math.min(255, scrollY * 2); // 执行动画效果 animateToolbarColor(Color.argb(alpha, 0xFF, 0x00, 0x00), Color.argb(0, 0x00, 0x00, 0x00)); } }); // 改变标题栏背景颜色和透明度的动画效果 private void animateToolbarColor(int fromColor, int toColor) { ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), fromColor, toColor); colorAnimation.setDuration(250); colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { toolbar.setBackgroundColor((int) animator.getAnimatedValue()); } }); colorAnimation.start(); } ``` 希望这个示例能够对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值