該方法實(shí)現(xiàn)跑馬燈簡(jiǎn)單,Android框架自帶
最近接手一個(gè)項(xiàng)目終端機(jī)應(yīng)用項(xiàng)目,頂部的廣告條是可以滾動(dòng)的跑馬燈形式的文字
產(chǎn)品嫌棄這個(gè)跑馬燈太慢了,讓我調(diào)整一下速度
該跑馬燈是用原生的TextView實(shí)現(xiàn)的
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="-1"
//需要獲取焦點(diǎn) 才可以正常工作
testTx.isSelected = true
再一番 探索之后發(fā)現(xiàn),原生的TextView? "marquee"模式,并不能調(diào)整速度
在網(wǎng)上搜索別人如何解決這個(gè)問題的,發(fā)現(xiàn)似乎不少人都遇到了,也有人寫了包裝好的自定義view,但是都過于復(fù)雜,需要不斷重新繪制,資源占用較高,甚至降低界面幀數(shù)
最近也在學(xué)習(xí)動(dòng)畫效果,遂自己用位移動(dòng)畫做一個(gè).自己動(dòng)手豐衣足食
下面上代碼:
第一步:
定義一個(gè)動(dòng)畫描述文件
\res\anim\marquee.xml
android:duration="3000"http://動(dòng)畫用時(shí),這個(gè)在代碼里面要改
android:fillAfter="false"
android:fillBefore="true"
android:fromXDelta="100%p"
android:fromYDelta="0"
android:interpolator="@android:anim/linear_interpolator"
android:repeatCount="-1"
android:repeatMode="restart"
android:toXDelta="-100%"
android:toYDelta="0%"
android:duration:動(dòng)畫持續(xù)時(shí)長(zhǎng)
android:fillAfter:動(dòng)畫結(jié)束之后是否保持動(dòng)畫的最終狀態(tài);true,表示保持動(dòng)畫的最終狀態(tài)
android:fillBefore:動(dòng)畫結(jié)束之后是否保持動(dòng)畫開始前的狀態(tài);true,表示恢復(fù)到動(dòng)畫開始前的狀態(tài)
android:fromXDelta:動(dòng)畫開始時(shí),在X軸方向上的位置;取值類型有三種:數(shù)字;百分比;百分比+”p”;?
數(shù)字:例如50.0,這里的單位是px像素
百分比:例如50%,這里是相對(duì)于自己控件寬度的百分比,實(shí)際的值是mIvImg.getWidth()*50%;
百分比+”p”:例如50%p,這里是表示相對(duì)于自己控件的父控件的百分比,
android:repeatCount:動(dòng)畫重復(fù)的次數(shù)。無限循環(huán)播放-1
android:repeatMode:動(dòng)畫重復(fù)的Mode,有reverse和restart兩種
android:startOffset:動(dòng)畫播放延遲時(shí)長(zhǎng),就是調(diào)用start之后延遲多少時(shí)間播放動(dòng)畫
android:toXDelta:動(dòng)畫移動(dòng)在X軸的目標(biāo)位置;取值類型和fromXDelta一樣
代碼:
helloTv是我要滾動(dòng)的textView,v是我定義的調(diào)節(jié)速度的常亮
private fun initMarquee() {
//重新測(cè)量hello的寬度
val w = helloTv.paint.measureText(helloTv.text.toString())
helloTv.layoutParams.width = w.toInt()
val animation = AnimationUtils.loadAnimation(this, R.anim.marquee).apply {
//定制相關(guān)屬性duration = (w * 10 / v).toLong()
}
helloTv.startAnimation(animation)
}
以上 就完成了,就是這么簡(jiǎn)單~~~