欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 利用图片取色法巧妙制作彩虹调色圆环

程序员文章站 2023-01-31 12:51:15
Android 利用图片取色法巧妙制作彩虹调色圆环前言说干就干编写布局编写逻辑完事前言先看UI设计图理论上应该自定义一个圆环View,但看到UI设计师已经将彩虹????圆环的图片切出来了,我陷入了沉思我直接从图片上取色不就好了?说干就干准备素材:彩虹圆环png图片;将圆环素材放进mipmap文件夹或drawable文件夹都可以;编写布局也就是装了两个ImageView,如果你不需要中间的圆形选中颜色显示,也可以只装一个ImageView

Android 利用图片取色法巧妙制作彩虹调色圆环

前言

先看UI设计图
Android 利用图片取色法巧妙制作彩虹调色圆环
理论上应该自定义一个圆环View,但看到UI设计师已经将彩虹????圆环的图片切出来了,我陷入了沉思

我直接从图片上取色不就好了?

说干就干

准备素材:

  1. 彩虹圆环png图片;

Android 利用图片取色法巧妙制作彩虹调色圆环
将圆环素材放进mipmap文件夹或drawable文件夹都可以;

编写布局

Android 利用图片取色法巧妙制作彩虹调色圆环
也就是装了两个ImageView,如果你不需要中间的圆形选中颜色显示,也可以只装一个ImageView

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 这个是彩虹圆环ImageView,必要 -->
    <ImageView
        android:id="@+id/img_color_picker"
        android:layout_width="180dp"
        android:layout_height="180dp"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@mipmap/bg_color_picker" />
        
    <!-- 这个是选中颜色显示的圆形ImageView,非必要 -->
    <ImageView
        android:id="@+id/img_color_center"
        android:layout_width="40dp"
        android:layout_height="40dp"
        app:layout_constraintBottom_toBottomOf="@+id/img_color_picker"
        app:layout_constraintEnd_toEndOf="@+id/img_color_picker"
        app:layout_constraintStart_toStartOf="@+id/img_color_picker"
        app:layout_constraintTop_toTopOf="@+id/img_color_picker"
        app:srcCompat="@drawable/bg_color_center" />
</androidx.constraintlayout.widget.ConstraintLayout>

编写逻辑

  1. 先声明一个bitmap矢量
/** 取色圆环的矢量 */
private var colorPickerBitmap: Bitmap? = null
  1. 将bitmap矢量初始化
// 初始化圆环矢量,这个post函数,在imgColorPicker控件加载完毕以后调用
binding.imgColorPicker.post {
    // 从ImageView控件imgColorPicker中得到bitmap
    colorPickerBitmap = (binding.imgColorPicker.drawable as BitmapDrawable).bitmap
    // 得到ImageView控件imgColorPicker的布局
    val params = binding.imgColorPicker.layoutParams
    // 将bitmap调整一下缩放比例以满足真实绘制的大小
    colorPickerBitmap = colorPickerBitmap?.scale(params.width, params.height)
}

缩放方法如下:

/**
 * 调整bitmap大小
 * @receiver Bitmap
 * @param width Int 目标宽度
 * @param height Int 目标高度
 * @return Bitmap
 */
fun Bitmap.scale(width: Int, height: Int) : Bitmap {
    // 获得图片的宽高
    val bw = this.width
    val bh = this.height
    // 计算缩放比例
    val sw = width.toFloat() / bw
    val sh = height.toFloat() / bh
    // 取得想要缩放的matrix参数
    val m = Matrix()
    m.postScale(sw, sh)
    return Bitmap.createBitmap(this, 0, 0, bw, bh, m, true)
}
  1. 监听圆环触摸事件
// 触摸取色圆环
binding.imgColorPicker.setOnTouchListener { _, event ->
    if (colorPickerBitmap != null) {
        // 获得触摸位置X轴坐标,并限制值在0到图片宽度大小
        val x = event.x.toInt().coerceAtLeast(0).coerceAtMost(colorPickerBitmap!!.width -1)
        // 获得触摸位置Y轴坐标,并限制值在0到图片高度大小
        val y = event.y.toInt().coerceAtLeast(0).coerceAtMost(colorPickerBitmap!!.height -1)
        // 获得触摸位置的颜色值
        val colorInt = colorPickerBitmap!!.getPixel(x, y)
        if (colorInt == 0) {
            LogUtils.d("触摸在透明区域")
        } else {
            // 设置选中颜色覆盖
            binding.imgColorCenter.setColorFilter(colorInt)
            ...
        }
    }
    true
}

完事

总体来说还是挺简单的,也可以当作是图片取色的一种想法。

本文地址:https://blog.csdn.net/sinat_38184748/article/details/108979027