在游戏陪玩源码开发时,会设计到很多UI界面设计,其中首页Banner轮播就很重要,最近发现一个比较有意思的效果图,于是想自己操作实践下。效果图如下:

作者实现的效果:

1. 游戏陪玩源码开发,仿某看书app首页Banner轮播+背景渐变实现思路

  • 使用Banner+ 透明的 ImageView 进行搭配实现。
  • 使用Palette来将Banner中每一个Bitmap进行取色,将最亮的色值取出。
  • 将取出的色值配置到背景ImageView上。

2.开始实现
(1) 导入依赖

//banner依赖
implementation 'com.youth.banner:banner:1.4.10'//palette依赖
implementation 'com.android.support:palette-v7:23.4.0'

(2)编写xml文件

 <RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/view_bg"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#999999"android:paddingTop="100dp"android:scaleType="fitXY"android:src="@drawable/banner_head_bg"android:visibility="visible" /><com.youth.banner.Bannerandroid:id="@+id/view_banner"android:layout_width="match_parent"android:layout_height="150dp"android:layout_marginTop="25dp"app:image_scale_type="fit_xy"app:indicator_height="6dp"app:indicator_width="6dp" /></RelativeLayout>

这里ImageVIew使用的图片如下(透明背景):

  • 下载后创建drawable-xxhdpi文件夹并放入图片

3.创建数据

  //Banner数据的集合var mBannerList: ArrayList<String> = ArrayList()//添加Banner的数据mBannerList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1556532613936&di=3769695217e3424f18c3d23966ecd4dc&imgtype=0&src=http%3A%2F%2Fpic.90sjimg.com%2Fback_pic%2Fqk%2Fback_origin_pic%2F00%2F04%2F19%2F70e2846ebc02ae10161f25bf7f5461a1.jpg");mBannerList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1556532665664&di=9ead9eb8a9fe2af9a01b0dd39f3e41f4&imgtype=0&src=http%3A%2F%2Fbpic.588ku.com%2Fback_pic%2F05%2F37%2F28%2F475a43591370453.jpg");mBannerList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1556532613934&di=0be1c6bbf0441bd19ef6d4e3ce799263&imgtype=0&src=http%3A%2F%2Fpic96.nipic.com%2Ffile%2F20160430%2F7036970_215739900000_2.jpg");mBannerList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1556532613936&di=4dd453940f49d9801826e6b820490957&imgtype=0&src=http%3A%2F%2Fpic161.nipic.com%2Ffile%2F20180410%2F26429156_154754410034_2.jpg");mBannerList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1556532613935&di=39c387012e3d8fa2eef90129eaf83c5c&imgtype=0&src=http%3A%2F%2Fpic25.nipic.com%2F20121211%2F7031681_170238437383_2.jpg");
  • 创建实体类用来存放通过Palette获取到游戏陪玩源码中的每个Banner的色值

Palette介绍

  • 它能让你从图像中提取突出的颜色。这个类能提取以下几种颜色:
  1. Vibrant (充满活力的)2. Vibrant dark (充满活力的黑)3. Vibrant light (充满活力的亮)4. Muted (柔和的)5. Muted dark (柔和的黑)6. Muted lighr (柔和的亮)
package com.lcz.coolweatherjetpack;/*** 作者:Lichenzge* 时间:2019/3/12 13:33* 描述:banner图片颜色渐变Bean* <p>* Vibrant (有活力)* Vibrant dark(有活力 暗色)* Vibrant light(有活力 亮色)* Muted (柔和)* Muted dark(柔和 暗色)* Muted light(柔和 亮色)*/
public class ColorInfo {private String imgUrl;private int vibrantColor = 0xFF999999;private int vibrantDarkColor = 0xFF999999;private int vibrantLightColor = 0xFF999999;private int mutedColor = 0xFF999999;private int mutedDarkColor = 0xFF999999;private int mutedLightColor = 0xFF999999;public String getImgUrl() {return imgUrl;}public void setImgUrl(String imgUrl) {this.imgUrl = imgUrl;}public int getVibrantColor() {return vibrantColor;}public void setVibrantColor(int vibrantColor) {this.vibrantColor = vibrantColor;}public int getVibrantDarkColor() {return vibrantDarkColor;}public void setVibrantDarkColor(int vibrantDarkColor) {this.vibrantDarkColor = vibrantDarkColor;}public int getVibrantLightColor() {return vibrantLightColor;}public void setVibrantLightColor(int vibrantLightColor) {this.vibrantLightColor = vibrantLightColor;}public int getMutedColor() {return mutedColor;}public void setMutedColor(int mutedColor) {this.mutedColor = mutedColor;}public int getMutedDarkColor() {return mutedDarkColor;}public void setMutedDarkColor(int mutedDarkColor) {this.mutedDarkColor = mutedDarkColor;}public int getMutedLightColor() {return mutedLightColor;}public void setMutedLightColor(int mutedLightColor) {this.mutedLightColor = mutedLightColor;}
}
  • 创建集合用来存放游戏陪玩源码中Banner背景颜色相关数据
//存放Banner背景颜色的集合var mColorList: ArrayList<ColorInfo> = ArrayList()
  • 将游戏陪玩源码的Banner中的每一条数据都存储集合中,方便后续通过Palette进行取色。
  count = mBannerList.sizemColorList.clear()for (i in 0..count + 1) {val info = ColorInfo()if (i == 0) {info.imgUrl = mBannerList.get(count - 1)} else if (i == count + 1) {info.imgUrl = mBannerList.get(0)} else {info.imgUrl = mBannerList.get(i - 1)}mColorList.add(info)}

数据都创建完成后就可以创建Banner的图片加载器了~

4. 创建Banner图片加载器,并使用Palette获取Banner图片色值并进行保存

Palette取色方法:

  • 取出来的值为RGB值
   //获取Palette 调色板// 这里的bitmap就是需要取色的图片val palette = Palette.from(bitmap).generate()//充满活力的色调val Vibrantrgb = palette.getVibrantSwatch()!!.rgb//充满活力的亮色调val LightVibrantrgb = palette.getLightVibrantSwatch()!!.rgb//充满活力的暗色调val DarkVibrantrgb = palette.getDarkVibrantSwatch()!!.rgb//柔和的色调val Mutedrgb = palette.getMutedSwatch()!!.rgb//柔和的亮色调val LightMutedrgb = palette.getLightMutedSwatch()!!.rgb//柔和的暗色调val DarkMutedrgb = palette.getDarkMutedSwatch()!!.rgb

创建BannerImageLoader类:

package com.lcz.coolweatherjetpackimport android.annotation.SuppressLint
import android.content.Context
import android.graphics.Bitmap
import android.widget.ImageView
import androidx.palette.graphics.Palette
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.youth.banner.loader.ImageLoader/*** @author: Lichengze* @e-mail:lcz3466601343@163.com* @time: 2021/1/11 16:01 星期一* @description:*/
class BannerImageLoader : ImageLoader {//存放Banner数据和颜色的集合var colorList: ArrayList<ColorInfo> = ArrayList()constructor(colorList: ArrayList<ColorInfo>) : super() {this.colorList = colorList}@SuppressLint("CheckResult")override fun displayImage(context: Context?, path: Any?, imageView: ImageView?) {if (path != null) {//设置Imageview的Pinging值 (美观)imageView!!.setPadding(30, 0, 30, 0);Glide.with(context!!).asBitmap().load(path.toString())//通过listener监听方法 将Banner中的每一张网络图片转换为Bitmap,并通过Bitmap进行取值.listener(object : RequestListener<Bitmap> {override fun onLoadFailed(e: GlideException?,model: Any?,target: Target<Bitmap>?,isFirstResource: Boolean): Boolean {return false}override fun onResourceReady(resource: Bitmap?,model: Any?,target: Target<Bitmap>?,dataSource: DataSource?,isFirstResource: Boolean): Boolean {setColorList(resource!!, path.toString())return false}//通过RequestOptions.bitmapTransform(RoundedCorners(20)) 设置图片为圆角}).apply(RequestOptions.bitmapTransform(RoundedCorners(20))).into(imageView!!);}}//将Banner中的每一张图片进行取值,并存放到ColorInfo类中private fun setColorList(bitmap: Bitmap, imgUrl: String) {if (colorList == null) {return}//初始化Paletteval palette = Palette.from(bitmap).generate()for (i in 0 until colorList.size) {if (colorList.get(i).getImgUrl().equals(imgUrl)) { // imgUrl作为识别标志if (palette.getVibrantSwatch() != null) {//获取充满活力的色调colorList.get(i).setVibrantColor(palette.getVibrantSwatch()!!.getRgb())}if (palette.getDarkVibrantSwatch() != null) {colorList.get(i).setVibrantDarkColor(palette.getDarkVibrantSwatch()!!.getRgb())}if (palette.getLightVibrantSwatch() != null) {colorList.get(i).setVibrantLightColor(palette.getLightVibrantSwatch()!!.getRgb())}if (palette.getMutedSwatch() != null) {colorList.get(i).setMutedColor(palette.getMutedSwatch()!!.getRgb())}if (palette.getDarkMutedSwatch() != null) {colorList.get(i).setMutedDarkColor(palette.getDarkMutedSwatch()!!.getRgb())}if (palette.getLightVibrantSwatch() != null) {colorList.get(i).setMutedLightColor(palette.getLightVibrantSwatch()!!.getRgb())}}}}/*** Vibrant (有活力)* Vibrant dark(有活力 暗色)* Vibrant light(有活力 亮色)* Muted (柔和)* Muted dark(柔和 暗色)* Muted light(柔和 亮色)*/fun getVibrantColor(position: Int): Int {return colorList[position].vibrantColor}fun getVibrantDarkColor(position: Int): Int {return colorList[position].vibrantDarkColor}fun getVibrantLightColor(position: Int): Int {return colorList[position].vibrantLightColor}fun getMutedColor(position: Int): Int {return colorList[position].mutedColor}fun getMutedDarkColor(position: Int): Int {return colorList[position].mutedDarkColor}fun getMutedLightColor(position: Int): Int {return colorList[position].mutedLightColor}
}

在加载器中将色值取出并存放到集合中,接下来就可以在游戏陪玩源码中的Banner每次滑动中把对应的色值配对到背景中了。

5. 监听Banner滑动,根据下标获取对应色值,将颜色配置到背景ImageView中。

通过Banner的setOnPageChangeListener进行监听

  • onPageScrolled:滚动中

  • onPageSelected:滚动选择中

在监听中使用通过ColorUtils 获取当前banner和下一个banner的色值。并将获取到的值配对到背景和状态栏中。

  var IsInit = trueprivate fun initView() {binding!!.viewBanner.setOnPageChangeListener(object : ViewPager.OnPageChangeListener {override fun onPageScrolled(position: Int,positionOffset: Float,positionOffsetPixels: Int) {if (positionOffset > 1) { //会出现极个别大于1的数据return}//修正position,解决两头颜色错乱,来自Banner控件源码if (position === 0) {position == count}if (position > count) {position == 1}if (count > 0) {val pos = (position + 1) % count //很关键//通过ColorUtils 获取当前banner的Vibrant颜色值val vibrantColor = ColorUtils.blendARGB(imageLoader.getVibrantColor(pos),imageLoader.getVibrantColor(pos + 1),positionOffset)//给背景和状态栏都配置颜色binding!!.viewBg.setBackgroundColor(vibrantColor)}}override fun onPageSelected(position: Int) {if (IsInit) { // 第一次,延时加载才能拿到颜色IsInit = falseHandler().postDelayed(Runnable {LogUtils.d("第一次加载")val vibrantColor: Int = imageLoader.getVibrantColor(1)binding!!.viewBg.setBackgroundColor(vibrantColor)}, 500)}}override fun onPageScrollStateChanged(state: Int) {}})/*** 设置状态栏颜色** @param activity*/fun setStatusBarColor(activity: Activity, color: Int) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {val window: Window = activity.window//状态栏改变颜色。window.setStatusBarColor(color)//状态栏改变颜色。LogUtils.d("color:$color")}}

6. 将加载器使用到Banner中。

 binding!!.viewBanner.setImageLoader(imageLoader)//设置图片集合.setImages(mBannerList)//设置banner动画效果// banner.setBannerAnimation(Transformer.DepthPage);//设置轮播时间.setDelayTime(3000)//banner设置方法全部调用完毕时最后调用.start()

总结
游戏陪玩源码开发,仿某看书app首页Banner轮播+背景渐变整体实现效果不难,重点在于通过Palette取色完成后,在滑动的监听中通过ColorUtils将数据转换并配对到背景中。

游戏陪玩源码开发,仿某看书app首页Banner轮播+背景渐变相关推荐

  1. 游戏陪玩源码的那些关键环节,利用了什么技术手段?

    在游戏陪玩源码开发中,有一个环节非常关键,那就是内容分发网络,CDN其实就是将源站中的相关数据提前缓存至CDN的各个节点中,这样当用户发起访问申请时,能直接从节点调取,不用再通过源站获取,有效的提高了 ...

  2. 提升游戏陪玩源码请求响应速度,应从哪方面下手?

    为了让游戏陪玩源码中的数据内容传输的更快.更稳定,我们通常会用到CDN.CDN能将游戏陪玩源码源站的资源缓存至各个网络节点,当用户发起访问请求时,会通过离用户最近的网络节点进行请求反馈,减少源站的访问 ...

  3. HTML大学生动漫网页设计作业源码 ~ 火影忍者动漫7页面带特效带轮播(HTML+CSS+JavaScript)...

    HTML大学生动漫网页设计作业源码 ~ 火影忍者动漫7页面带特效带轮播(HTML+CSS+JavaScript) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业 ...

  4. HTML大学生动漫网页设计作业源码 ~ 火影忍者动漫7页面带特效带轮播(HTML+CSS+JavaScript)

    HTML大学生动漫网页设计作业源码 ~ 火影忍者动漫7页面带特效带轮播(HTML+CSS+JavaScript) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业 ...

  5. 游戏陪玩App,如雨后春笋般冒出,直接导致整个游戏陪玩源码市场的持续火爆

    随着"开黑"需求日益庞大,各类游戏陪玩App近两年如雨后春笋般冒出,市面上超过 30款提供此类服务的App,比如,暴鸡电竞.高手电竞.比心.大神电竞.约宝宝.猪队友.买萌.开黑大师 ...

  6. android 滑动接听源码,android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码...

    Android精选源码 Android优质博客 前言permissions4m 最初的设计是仅仅做成一个编译器注解框架,在1.0.0版本时,它纯粹地实现了原生 Android 请求流程,关于它的设计思 ...

  7. 最新游戏陪玩源码V2.0升级版/商业版语音聊天系统源码

    正文: 完整标题: 此次更新在原有版本上传再次升级,修复部分逻辑以及bug. ​修复bug:店员拒单后,退款会退到店员账号里而不是用户账户里. 修复bug:客户在盲盒下单后,马上取消了订单,但是店员还 ...

  8. 个人设计web前端大作业~响应式游戏网站源码(HTML+CSS+Bootstrap)

    HTML期末大作业课程设计游戏主题html5网页~响应式游戏网站(HTML+CSS+Bootstrap) ~个人设计web前端大作业 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头 ...

  9. 语音陪玩源码如何做到不卡顿?

    对于语音通话来说,当延时高于200ms时,就会影响到用户的体验,达到460ms时,就能让对方用户很明显的感知出来,1s以上的延迟在交互式的语音聊天中不被接受,所以在语音陪玩源码开发时,要注意语音连麦技 ...

最新文章

  1. VS调试时提示此项目已经过期
  2. J. Cheminform. | DrugEx v2:多重药理学中基于pareto的多目标强化学习的药物分子从头设计...
  3. 17.2?Replication Implementation 复制实施:
  4. Android-2D绘图
  5. es对分组后结果进行统计_ElasticSearch里面如何分组后根据sum值排序
  6. mysql is fashion ctf_《亲爱的,热爱的》中的 CTF 大赛是什么?参加这个比赛的体验怎么样?...
  7. 前后端分离和微服务_为什么说微服务,要从前后端分离开始?一文带你揭秘深入微服务...
  8. rar for android最新版,RAR for Android手机版下载-RAR for Android 安卓压缩软件v5.30 安卓版下载-腾牛安卓网...
  9. php开发入门,PHP开发入门教程之面向对象
  10. 判断.java文件中getConnection与cleanUp数量是否匹配
  11. POJ 2240 ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
  12. xpath之string(.)方法
  13. Java-数字相关类
  14. C语言编写的爱心代码
  15. Android实现连点按钮三下退出程序
  16. IT人二十年后再定位
  17. 关于解决Windows系统许可证即将过期的问题
  18. iOS 15个人热点无法连接?10个修复技巧分享
  19. 从今日头条抄袭到京东水逆,为何互联网公司人设会接连崩塌?
  20. CCF 行车路线 100分

热门文章

  1. http状态码521——记一次网页爬取
  2. saxon 处理xslt
  3. 精彩演讲推荐|智能化变更防控方法、架构与组织实践
  4. Go语言基础语法讲解与学习
  5. win10 链接oracle11g,win10系统PLSQLDeveloper无法连接Oracle11g的解决方法
  6. 深度学习框架TensorFlow取名由来
  7. Mac通过RVI使用Wireshark对iPhone抓包
  8. 报错no attribute approx
  9. 江苏大学计算机专业分数,江苏大学2020年所有招生专业录取分数大排行
  10. 琢金广告浅谈网络推广人员的职责