程诺陪你学Android自定义控件UI效果仿写

Android超简单实现打字动画效果

2019-07-26  本文已影响107人  itfitness

目录

目录

效果展示

实现原理

●文字动画



●文字换行



换行的绘制逻辑如下,遍历文字行数获取到行的索引值,每一行文字的开始绘制的位置都是换行文字索引值集合对应的行的索引值的索引所对应的值,比如第一行开始的位置就是0,第二行开始的位置则是上一行换行字符的索引值了。
 if(mTextLineCountList.size>0){
            for(i in 1..mTextLine){//遍历行数(行数从1开始)
                if(mAnimProgress>mTextLineCountList[i-1]){//只有当动画所对应的值大于文字开始绘制的文字索引的时候才开始绘制。这是为了避免因行数超过一行的时候出现的文字绘制的开始位置比结束位置大的情况。
                    canvas!!.drawText(mText,mTextLineCountList[i-1],mAnimProgress,0f,(mPaint.fontMetrics.bottom-mPaint.fontMetrics.top)*i,mPaint)
                }
            }
        }

控件的使用

这里我没有进行自定义属性的添加,只是添加了两个简单的方法:
●setAnimText:设置动画文字

fun setAnimText(animText:String){
        mText = animText
        calcStrlineCount()
        requestLayout()//重新计算控件高度,否则控件的高度不会发生变化
    }

●startAnim:开始动画

fun startAnim(){
        mAnimator = ValueAnimator.ofInt(1, mText.length)
        mAnimator!!.interpolator = LinearInterpolator()//匀速动画
        mAnimator!!.duration = (mSingleTextAnimDuration * mText.length).toLong()//mSingleTextAnimDuration是每个文字动画的时间,这里乘以字符串的长度就得出了整个文字动画的时间了
        mAnimator!!.addUpdateListener {
            mAnimProgress = it.animatedValue as Int
            invalidate()
        }
        mAnimator!!.start()
    }

●Activity中进行调用

bt_startanim.setOnClickListener {
            atv.setAnimText("我是动画文字啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦哈哈哈哈")
            atv.startAnim()
        }

控件源码

控件源码:文字动画

上一篇下一篇

猜你喜欢

热点阅读