当前位置:首页 > IT技术 > 移动平台 > 正文

直播视频app源码,自定义可点击可滑动的通用RatingBar
2021-09-15 15:07:45

直播视频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 = true
    xfermode = 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 / 100f
    val starDrawCount = percent * starCount
    return 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->2
    val round = round(x)
    return when {
        round < x -> round + 0.5f
        round > x -> round
        else -> 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.x
    downY = 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实现的相关代码,更多内容欢迎关注之后的文章

 

本文摘自 :https://www.cnblogs.com/