Android 自定义 温度计控件

直接上代码

import android.animation.Animator
import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.*
import android.os.Build
import android.util.AttributeSet
import android.util.Property
import android.view.View
import androidx.annotation.RequiresApi
import java.math.RoundingMode
import java.text.DecimalFormat

/**
 * 温度计
 * @author WangYL
 * @Date 2021
 */
class ThermometerView : View {

    private var mContext: Context

    private var mHeight: Int = 0

    private var mWidth: Int = 0

    // 最终的大小
    private var mSize: Int = 0

    // 试管底部的圆大小
    private var reagentWidth: Float = 70f

    //内边距(默认固定死)
    private var padding: Float = 15f

    private var srcBitmap: Bitmap? = null

    private var srcCanvas: Canvas? = null

    private var dstBitmap: Bitmap? = null

    private var dstCanvas: Canvas? = null

    private var mRectF: RectF? = null

    //定义PorterDuffXfermode变量
    private val pdXfermode: PorterDuffXfermode by lazy {
        //创建一个PorterDuffXfermode对象
        PorterDuffXfermode(PD_MODE)
    }

    //定义MODE常量,等下直接改这里即可进行测试
    private val PD_MODE = PorterDuff.Mode.SRC_ATOP

    /**
     * 默认画笔
     */
    private val mPaint: Paint = Paint().apply {
        style = Paint.Style.FILL
        textSize
        isAntiAlias = true
    }

    /**
     * 文字画笔
     */
    private val textPaint: Paint = Paint().apply {
        style = Paint.Style.FILL
        val density: Float = resources.displayMetrics.density
        textSize = density * 13
        color = Color.parseColor("#333333")
        isAntiAlias = true
    }

    /**
     * 刻度画笔
     */
    private val progresPaint: Paint = Paint().apply {
        style = Paint.Style.FILL
        color = Color.parseColor("#F0875C")
        isAntiAlias = true
    }

    /**
     * 当前温度
     */
    private var currenTemp = 35 - 0.1f

    private var maxTemp: Float = 41f

    private var minTemp: Float = 35f

    private var scaleCount = 80

    constructor(context: Context) : this(context, null)

    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    ) {
        this.mContext = context

        reagentWidth
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android自定义View是指基于Android原生控件的一种扩展,可以根据自己的需求和设计规范来创建更加个性化和独特的控件。而歌词控件是一种针对音乐播放器或者视频播放器等应用场景中的需求,用于显示音乐或者视频的歌词的控件Android自定义View歌词控件的实现思路如下: 1. 首先需要自定义一个View,并继承自View或者其子类,如TextView。 2. 在自定义的View中重写onDraw方法,在其中实现绘制歌词的逻辑。 3. 在onDraw方法中,使用Canvas对象进行绘制,可以使用drawText方法绘制歌词文本,也可以使用drawBitmap方法绘制图片背景等。 4. 可以通过自定义属性,如字体大小、字体颜色、歌词滚动速度等,来对歌词控件进行配置。 5. 如果需要实现歌词的滚动效果,可以使用ValueAnimator或者Scroller来实现歌词的平滑滚动。 6. 如果需要实现点击歌词跳转播放进度的功能,可以通过添加点击事件监听器,在触摸事件中判断点击位置对应的歌词行,并根据歌词的时间戳跳转到指定的播放进度。 总结来说,Android自定义View歌词控件的实现需要重写onDraw方法进行绘制,可以通过Canvas对象进行绘制文本或者图像,通过自定义属性进行配置,使用动画或者滚动实现歌词的平滑滚动,通过监听触摸事件实现点击歌词跳转播放进度的功能。通过以上步骤,我们可以创建一个个性化的歌词控件,满足不同应用场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值