直播视频app源码,自定义可点击可滑动的通用RatingBar实现的相关代码
绘制ratingbar

绘制未选中的背景

/*** 未选中Bitmap*/
private val starBgBitmap: Bitmap by lazy {val bitmap = Bitmap.createBitmap(starSize, starSize, Bitmap.Config.ARGB_8888)val canvas = Canvas(bitmap)val starDrawable = ContextCompat.getDrawable(context, starBgDrawable)starDrawable?.setBounds(0, 0, starSize, starSize)starDrawable?.draw(canvas)bitmap
}/*** 绘制星星默认未选中背景*/
private fun drawStar(canvas: Canvas) {for (i in 0 until starCount) {val starLeft = i * (starSize + starPadding)canvas.drawBitmap(starBgBitmap, starLeft, 0f, starBgPaint)}
}

绘制选中图标

这里bitmap宽度使用starSize + starPadding,配合BitmapShader的repeat模式,可以方便绘制出高亮的图标

/*** 选中icon的Bitmap*/
private val starBitmap: Bitmap by lazy {val bitmap = Bitmap.createBitmap(starSize + starPadding.toInt(), starSize, Bitmap.Config.ARGB_8888)val canvas = Canvas(bitmap)val starDrawable = ContextCompat.getDrawable(context, starDrawable)starDrawable?.setBounds(0, 0, starSize, starSize)starDrawable?.draw(canvas)bitmap
}/*** 绘制高亮图标*/
private fun drawStarDrawable(canvas: Canvas) {starDrawablePaint.shader = BitmapShader(starBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)canvas.drawRect(0f, 0f, getStarProgressWidth(), height.toFloat(), starDrawablePaint)
}

绘制纯色的选中效果

使用离屏缓冲,纯色矩形与未选中背景相交的地方进行显示。具体使用可以参考扔物线大佬的文章

/*** 星星纯色画笔*/
private val starPaint = Paint().apply {isAntiAlias = truexfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
}canvas?.let {// xfermode需要使用离屏缓存val saved = it.saveLayer(null, null)drawStar(it)if (starDrawable == -1) {drawStarBgColor(it)} else {drawStarDrawable(it)}it.restoreToCount(saved)
}/*** 绘制高亮纯颜色*/
private fun drawStarBgColor(canvas: Canvas) {canvas.drawRect(0f, 0f, getStarProgressWidth(), height.toFloat(), starPaint)
}

绘制进度

根据type更正显示效果,是取半,取整还是任意取进度。open方法,可以方便修改

/*** 获取星星绘制宽度*/
private fun getStarProgressWidth(): Float {val percent = progress / 100fval starDrawCount = percent * starCountreturn when (starType) {StarType.HALF.ordinal -> {ceilHalf(starDrawCount) * starSize + starDrawCount.toInt() * starPadding}StarType.WHOLE.ordinal -> {ceilWhole(starDrawCount) * starSize + starDrawCount.toInt() * starPadding}else -> {starDrawCount * starSize + starDrawCount.toInt() * starPadding}}
}/*** 取整规则*/
private fun ceilWhole(x: Float): Float {return ceil(x)
}/*** 取半规则*/
private fun ceilHalf(x: Float): Float {// 四舍五入 1.3->1+0.5->1.5 1.7->2val round = round(x)return when {round < x -> round + 0.5fround > x -> roundelse -> x}
}

点击+滑动

点击+滑动就是重写onTouchEvent事件:

判断点击位置是否在范围内/*** 点击的point是否在view范围内*/
private fun pointInView(x: Float, y: Float): Boolean {return Rect(0, 0, width, height).contains(x.toInt(), y.toInt())
}

记录按下位置,抬起位置。

MotionEvent.ACTION_DOWN -> {downX = event.xdownY = event.y
}
MotionEvent.ACTION_UP -> {if (starClickable && abs(event.y - downY) <= touchSlop && abs(event.x - downX) <= touchSlop && pointInView(event.x, event.y)) {parent.requestDisallowInterceptTouchEvent(true)val progress = (event.x / width * 100).toInt()setProgress(progress)listener?.onClickProgress(progress)} else {parent.requestDisallowInterceptTouchEvent(false)}
}

滑动记录手指move

MotionEvent.ACTION_MOVE -> {if (starScrollable && abs(event.x - downX) - abs(event.y - downY) >= touchSlop && pointInView(event.x, event.y)) {parent.requestDisallowInterceptTouchEvent(true)val progress = (event.x / width * 100).toInt()setProgress(progress)listener?.onScrollProgress(progress)} else {parent.requestDisallowInterceptTouchEvent(false)}
}

以上就是 直播视频app源码,自定义可点击可滑动的通用RatingBar实现的相关代码,更多内容欢迎关注之后的文章

直播视频app源码,自定义可点击可滑动的通用RatingBar相关推荐

  1. 直播视频app源码,Android 点击生成二维码

    直播视频app源码,Android 点击生成二维码实现的相关代码 activity.xml代码如下: <?xml version="1.0" encoding="u ...

  2. java修改动态视频,直播视频app源码,动态修改cron

    直播视频app源码,动态修改cron相关的代码 package com.chashiyu.task.dynamic; import org.springframework.beans.factory. ...

  3. 实现一个直播视频app源码的邀请码功能

    最近做一个直播视频app源码的邀请码功能,一直没找到感觉很完美的方法,然后自己造了一个轮子,当然效果还不是很完善. 首先我认为直播视频app源码的邀请码需要有以下特性: 1.唯一性,不能出现两个场景下 ...

  4. 实现直播视频app源码的底部导航栏

    底部导航栏的应用非常的广泛.今天就介绍直播视频app源码的其中一种实现方式. 一.Fragment + TextView 实现 前面一篇博客在介绍Fragment 的时候就使用了Fragment + ...

  5. 直播视频app源码的靓号可以怎样实现?

    一般开发直播视频app源码时,会预留一些号码给以后升级的会员使用,比如靓号,直播视频app源码采用正则表达式实现较好,通过规则引擎的后台页面做成实时可配置的也是不错的选择. 一. 一般会有如下的正则需 ...

  6. 直播视频app源码,保存图片到系统相册

    直播视频app源码,保存图片到系统相册相关的代码 public static void saveImageToGallery(Context context, Bitmap bmp) {// 首先保存 ...

  7. 直播视频app源码,高度不能充满全屏

    直播视频app源码,修改高度不能充满全屏相关的代码 <ScrollViewandroid:layout_width="match_parent"android:layout_ ...

  8. 教你实现,搭建直播视频app源码的账号体系

    账号体系价值 我们先来说一下直播视频app源码账号体系的价值,账号基础价值是用户识别,并将用户权益关联在账号下.账号在一定程度上就等同于会员,通过服务与用户建立深度链接.在这个得用户者得天下的时代,各 ...

  9. 直播视频app源码的分享功能,是这样实现的

    直播视频app源码拥有大量的用户和直播内容,为了方便用户分享平台内容,直播视频app源码实现了分享到第三方的功能,下面就是直播视频app源码实现分享功能的代码. <!doctype html&g ...

最新文章

  1. 基础的重要性(程序猿之路)
  2. LeetCode Ugly Number
  3. pearsonr() python_Python 来算算一线城市的二手房价格指数相关性
  4. JAVA遍历21位数
  5. 因为我们一直强调选品的重要性
  6. 使用T-SQL管理数据中的Unicode字符
  7. UVa1586 - Molar mass
  8. httplib模块,测试cdn节点文件同步
  9. DispatcherHelper
  10. Hbase table CRUD操作及scala编程
  11. opengl es3.0游戏开发学习笔记1-绘制旋转的三角形
  12. 一个白学家眼里的 WebAssembly
  13. 五子棋c语言策划书活动内容,五子棋比赛活动的策划案
  14. Excel高级应用教程:数据处理与数据分析
  15. vs code masm dll
  16. 微信公众号推文各标签含义
  17. 阿里云短信 签名 模板编写
  18. python信息处理 WXQ 153
  19. hdu 2048 错排公式 神、上帝以及老天爷
  20. 联想笔记本:安装适配自己电脑的驱动

热门文章

  1. Android+iOS自动化基于appium环境搭建
  2. mysql字段值拼接字符串
  3. Java调用linux终端命令
  4. 帝国CMS2018年最新漏洞获取管理员密码
  5. MySQL高级篇(高阳)建表sql语句大全
  6. Linux 系统Apache配置SSL证书
  7. 骑行,让患病的机率降到最低
  8. PHP中给数组中追加元素
  9. Android防劫持
  10. css设置div不可编辑,css 怎么设置div不可点击