96 lines
3.6 KiB
Kotlin
96 lines
3.6 KiB
Kotlin
package com.xscm.modulemain
|
||
|
||
import android.graphics.*
|
||
import android.graphics.drawable.Drawable
|
||
|
||
/**
|
||
* 这是设置图片设置拉伸区域
|
||
*/
|
||
class FakeNinePatchDrawable(
|
||
private val bitmap: Bitmap,
|
||
// 定义拉伸区域的坐标(相对图片的百分比,范围 0~1)
|
||
private val left: Float, // 左边界(左侧不拉伸区域的宽度比例)
|
||
private val top: Float, // 上边界(上侧不拉伸区域的高度比例)
|
||
private val right: Float, // 右边界(右侧不拉伸区域的宽度比例)
|
||
private val bottom: Float // 下边界(下侧不拉伸区域的高度比例)
|
||
) : Drawable() {
|
||
|
||
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
|
||
private val rect = Rect() // 绘制区域
|
||
|
||
override fun draw(canvas: Canvas) {
|
||
val bounds = bounds // 视图的实际尺寸(需要填充的区域)
|
||
val w = bitmap.width
|
||
val h = bitmap.height
|
||
|
||
// 计算分割点(像素值)
|
||
val splitLeft = (w * left).toInt()
|
||
val splitTop = (h * top).toInt()
|
||
val splitRight = (w * right).toInt()
|
||
val splitBottom = (h * bottom).toInt()
|
||
|
||
// 1. 绘制四个角(不拉伸)
|
||
// 左上
|
||
rect.set(0, 0, splitLeft, splitTop)
|
||
canvas.drawBitmap(bitmap, Rect(0, 0, splitLeft, splitTop), rect, paint)
|
||
// 右上
|
||
rect.set(bounds.width() - (w - splitRight), 0, bounds.width(), splitTop)
|
||
canvas.drawBitmap(bitmap, Rect(splitRight, 0, w, splitTop), rect, paint)
|
||
// 左下
|
||
rect.set(0, bounds.height() - (h - splitBottom), splitLeft, bounds.height())
|
||
canvas.drawBitmap(bitmap, Rect(0, splitBottom, splitLeft, h), rect, paint)
|
||
// 右下
|
||
rect.set(
|
||
bounds.width() - (w - splitRight),
|
||
bounds.height() - (h - splitBottom),
|
||
bounds.width(),
|
||
bounds.height()
|
||
)
|
||
canvas.drawBitmap(bitmap, Rect(splitRight, splitBottom, w, h), rect, paint)
|
||
|
||
// 2. 绘制四条边(单向拉伸)
|
||
// 上边(水平拉伸)
|
||
rect.set(splitLeft, 0, bounds.width() - (w - splitRight), splitTop)
|
||
canvas.drawBitmap(bitmap, Rect(splitLeft, 0, splitRight, splitTop), rect, paint)
|
||
// 下边(水平拉伸)
|
||
rect.set(
|
||
splitLeft,
|
||
bounds.height() - (h - splitBottom),
|
||
bounds.width() - (w - splitRight),
|
||
bounds.height()
|
||
)
|
||
canvas.drawBitmap(bitmap, Rect(splitLeft, splitBottom, splitRight, h), rect, paint)
|
||
// 左边(垂直拉伸)
|
||
rect.set(0, splitTop, splitLeft, bounds.height() - (h - splitBottom))
|
||
canvas.drawBitmap(bitmap, Rect(0, splitTop, splitLeft, splitBottom), rect, paint)
|
||
// 右边(垂直拉伸)
|
||
rect.set(
|
||
bounds.width() - (w - splitRight),
|
||
splitTop,
|
||
bounds.width(),
|
||
bounds.height() - (h - splitBottom)
|
||
)
|
||
canvas.drawBitmap(bitmap, Rect(splitRight, splitTop, w, splitBottom), rect, paint)
|
||
|
||
// 3. 绘制中间区域(双向拉伸)
|
||
rect.set(
|
||
splitLeft,
|
||
splitTop,
|
||
bounds.width() - (w - splitRight),
|
||
bounds.height() - (h - splitBottom)
|
||
)
|
||
canvas.drawBitmap(bitmap, Rect(splitLeft, splitTop, splitRight, splitBottom), rect, paint)
|
||
}
|
||
|
||
override fun setAlpha(alpha: Int) {
|
||
paint.alpha = alpha
|
||
invalidateSelf()
|
||
}
|
||
|
||
override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
|
||
override fun getAlpha(): Int = paint.alpha
|
||
override fun setColorFilter(colorFilter: ColorFilter?) {
|
||
paint.colorFilter = colorFilter
|
||
invalidateSelf()
|
||
}
|
||
} |