Android 自定义EditText

本文介绍了在AndroidStudio中的MateriaEditText组件中,如何使用ObjectAnimator实现入场和出场动画,以及如何通过`floatingLabelFraction`属性控制浮动标签的显示和隐藏。
摘要由CSDN通过智能技术生成

ObjectAnimator 动画需要一个起点和终点,不指定起点 默认从0开始,导致有时候有入场动画没有出场动画

源码:

package com.example.androidstudiogiraffe.view

import android.animation.ObjectAnimator
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatEditText
import com.example.androidstudiogiraffe.R
import com.future.startstudyproject.utils.dp


private val TEXTSIZE = 12.dp
private val TEXT_MARGIN = 8.dp
private val H_OFFSET = 5.dp
private val V_OFFSET = 23.dp
private val EXTRA_V_OFFSET = 16.dp


class MateriaEditText(context: Context, attrs: AttributeSet) :
    AppCompatEditText(context, attrs) {

    val paint = Paint(Paint.ANTI_ALIAS_FLAG)
    private var floatintlabelshown = false

    var isShowTopHint = false
        set(value) {
            if (field != value) {
                field = value
                if (field) {
                    setPadding(paddingLeft, (paddingTop + TEXTSIZE + TEXT_MARGIN).toInt(), paddingRight, paddingBottom)
                } else {
                    setPadding(paddingLeft, (paddingTop - TEXTSIZE - TEXT_MARGIN).toInt(), paddingRight, paddingBottom)
                }
            }
        }

    var floatingLabelFraction = 0f
        set(value) {
            field = value
            invalidate()
        }

    private val animator by lazy {
        ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f)
    }

    init {
        paint.textSize = TEXTSIZE
        val typeArr = context.obtainStyledAttributes(attrs,R.styleable.MateriaEditText)
        isShowTopHint = typeArr.getBoolean(R.styleable.MateriaEditText_isShowTopHint,true)

    }

    override fun onTextChanged(
        text: CharSequence,
        start: Int,
        lengthBefore: Int,
        lengthAfter: Int
    ) {
        if (isShowTopHint) {
            if (floatintlabelshown && text.isEmpty()) {
                floatintlabelshown = false
                animator.reverse()
            } else if (!floatintlabelshown && text.isNotEmpty()) {
                floatintlabelshown = true
                animator.start()
            }
        }
    }


    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        paint.alpha = (floatingLabelFraction * 0xff).toInt()
        val currentVerValue = V_OFFSET + EXTRA_V_OFFSET * (1 - floatingLabelFraction)

        canvas.drawText(hint.toString(), H_OFFSET, currentVerValue, paint)

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值