最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義可控制速度的跑馬燈

 更新時(shí)間:2022年06月28日 10:11:19   作者:Android師哥  
這篇文章主要為大家詳細(xì)介紹了Android自定義可控制速度的跑馬燈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

背景

原生的TextView是支持跑馬燈效果的,但是在項(xiàng)目中實(shí)際用了之后,達(dá)不到需求,原因是內(nèi)容滾動(dòng)太慢,速度無(wú)法調(diào)節(jié)。因此,需要自定義一個(gè)可以調(diào)節(jié)速度的跑馬燈。

思路

目前實(shí)現(xiàn)的思路是對(duì)文本內(nèi)容不斷地重繪,同時(shí)改變每次重繪的坐標(biāo),來(lái)在視覺(jué)上達(dá)到內(nèi)容在滾動(dòng)的效果。缺點(diǎn)是如果每次改變的坐標(biāo)差值太大,會(huì)有明顯的卡頓效果。經(jīng)過(guò)調(diào)試,下面源碼中的速度感覺(jué)還可以接受,如果有特殊需求,自行在調(diào)試一下。

源碼(Kotlin)

class CustomMarqueeView : AppCompatTextView {
? ? companion object {
? ? ? ? val SPEED_FAST = 9
? ? ? ? val SPEED_MEDIUM = 6
? ? ? ? val SPEED_SLOW = 3
? ? }

? ? //View寬度
? ? private var mViewWidth = 0
? ? private var mViewHeight = 0
? ? private var mScrollX = 0F
? ? private var mMarqueeMode = 3
? ? private val rect = Rect()

? ? 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
? ? ) {
? ? ? ? includeFontPadding = false
? ? ? ? initAttrs(context, attrs)
? ? }

? ? fun setScrollSpeed(speed: Int) {
? ? ? ? if (speed == SPEED_FAST || speed == SPEED_MEDIUM || speed == SPEED_SLOW) {
? ? ? ? ? ? mMarqueeMode = speed
? ? ? ? }
? ? }


? ? override fun onDraw(canvas: Canvas?) {
? ? ? ? val textContentText = text.toString().trim()
? ? ? ? if (TextUtils.isEmpty(textContentText)) {
? ? ? ? ? ? return
? ? ? ? }
? ? ? ? val x = mViewWidth - mScrollX
? ? ? ? val y = mViewHeight / 2F + getTextContentHeight() / 2
? ? ? ? canvas?.drawText(textContentText, x, y, paint)
? ? ? ? mScrollX += mMarqueeMode
? ? ? ? if (mScrollX >= (mViewWidth + getTextContentWdith())) {
? ? ? ? ? ? mScrollX = 0F
? ? ? ? }
? ? ? ? invalidate()
? ? }

? ? override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
? ? ? ? super.onMeasure(widthMeasureSpec, heightMeasureSpec)
? ? ? ? mViewWidth = MeasureSpec.getSize(widthMeasureSpec)
? ? ? ? mViewHeight = MeasureSpec.getSize(heightMeasureSpec)
? ? }
? ??
? ? override fun setTextColor(color: Int) {
? ? ? ? super.setTextColor(color)
? ? ? ? paint.setColor(color)
? ? }

? ? private fun initAttrs(context: Context, attrs: AttributeSet?) {
? ? ? ? val typeArray = context.obtainStyledAttributes(attrs, R.styleable.CustomMarqueeView)
? ? ? ? mMarqueeMode =
? ? ? ? ? ? typeArray.getInt(R.styleable.CustomMarqueeView_customScrollSpeed, mMarqueeMode)
? ? ? ? typeArray.recycle()
? ? }

? ? /**
? ? ?* 測(cè)量文字寬度
? ? ?* @return 文字寬度
? ? ?*/
? ? private fun getTextContentWdith(): Int {
? ? ? ? val textContent = text.toString().trim()
? ? ? ? if (!TextUtils.isEmpty(textContent)) {
? ? ? ? ? ? paint.getTextBounds(textContent, 0, textContent.length, rect)
? ? ? ? ? ? return rect.width()
? ? ? ? }
? ? ? ? return 0
? ? }

? ? /**
? ? ?* 測(cè)量文字高度
? ? ?* @return 文字高度
? ? ?*/
? ? private fun getTextContentHeight(): Int {
? ? ? ? val textContent = text.toString().trim()
? ? ? ? if (!TextUtils.isEmpty(textContent)) {
? ? ? ? ? ? paint.getTextBounds(textContent, 0, textContent.length, rect)
? ? ? ? ? ? return rect.height()
? ? ? ? }
? ? ? ? return 0
? ? }
}

自定義屬性

<declare-styleable name="CustomMarqueeView">
? <attr name="customScrollSpeed">
? ? <enum name="fast" value="9" />
? ? <enum name="medium" value="6" />
? ? <enum name="slow" value="3" />
? </attr>
</declare-styleable>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android VideoView類實(shí)例講解

    Android VideoView類實(shí)例講解

    本文主要介紹Android VideoView類,這里對(duì)VideoView類詳細(xì)說(shuō)明了使用方法,以及示例代碼,有興趣的朋友可以參考下,希望能幫助Android 開(kāi)發(fā)的朋友
    2016-08-08
  • Android基于OpenGL的GLSurfaceView創(chuàng)建一個(gè)Activity實(shí)現(xiàn)方法

    Android基于OpenGL的GLSurfaceView創(chuàng)建一個(gè)Activity實(shí)現(xiàn)方法

    這篇文章主要介紹了Android基于OpenGL的GLSurfaceView創(chuàng)建一個(gè)Activity實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android中OpenGL圖形操作類GLSurfaceView的功能、用法及相關(guān)使用技巧,需要的朋友可以參考下
    2016-10-10
  • Android編程自定義Dialog的方法分析

    Android編程自定義Dialog的方法分析

    這篇文章主要介紹了Android編程自定義Dialog的方法,結(jié)合實(shí)例形式分析了Android自定義Dialog的界面布局、功能實(shí)現(xiàn)及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-03-03
  • Android文件選擇器ExFilePicker的使用方法

    Android文件選擇器ExFilePicker的使用方法

    這篇文章主要為大家詳細(xì)介紹了Android文件選擇器ExFilePicker的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 利用Android畫(huà)圓弧canvas.drawArc()實(shí)例詳解

    利用Android畫(huà)圓弧canvas.drawArc()實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于利用Android畫(huà)圓弧canvas.drawArc()的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的理解和學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Android動(dòng)態(tài)人臉檢測(cè)的示例代碼(臉數(shù)可調(diào))

    Android動(dòng)態(tài)人臉檢測(cè)的示例代碼(臉數(shù)可調(diào))

    本篇文章主要介紹了Android動(dòng)態(tài)人臉檢測(cè)的示例代碼(臉數(shù)可調(diào)),具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • 你必須掌握在Flutter中添加資源文件的方法

    你必須掌握在Flutter中添加資源文件的方法

    這篇文章主要介紹了你必須掌握在Flutter中添加資源文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • 深入Android中BroadcastReceiver的兩種注冊(cè)方式(靜態(tài)和動(dòng)態(tài))詳解

    深入Android中BroadcastReceiver的兩種注冊(cè)方式(靜態(tài)和動(dòng)態(tài))詳解

    這篇文章主要介紹了深入Android中BroadcastReceiver的兩種注冊(cè)方式(靜態(tài)和動(dòng)態(tài))詳解,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-12-12
  • android與asp.net服務(wù)端共享session的方法詳解

    android與asp.net服務(wù)端共享session的方法詳解

    這篇文章主要給大家介紹了關(guān)于android與asp.net服務(wù)端如何共享session的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09
  • Android中使用ListView繪制自定義表格技巧分享

    Android中使用ListView繪制自定義表格技巧分享

    使用ListView繪制自定義的表格有朋友嘗試過(guò)沒(méi)有,下面為大家分享下要實(shí)現(xiàn)下圖的效果有幾個(gè)方面,參照著這幾點(diǎn)做了個(gè)簡(jiǎn)單的實(shí)現(xiàn)不是問(wèn)題好了,話不多說(shuō)看代碼
    2013-06-06

最新評(píng)論

茂名市| 苍溪县| 九龙城区| 东乌珠穆沁旗| 大邑县| 高雄市| 遂溪县| 辽阳市| 梅州市| 师宗县| 海阳市| 九江市| 莱阳市| 永清县| 金华市| 安塞县| 武平县| 潜山县| 焦作市| 马尔康县| 全椒县| 芦山县| 土默特右旗| 丘北县| 仪征市| 喜德县| 淅川县| 延寿县| 阿合奇县| 齐河县| 武鸣县| 汶上县| 镇坪县| 安新县| 吉木萨尔县| 富裕县| 象山县| 拉萨市| 新竹市| 淮北市| 石首市|