Android實(shí)現(xiàn)跑馬燈效果的代碼詳解
Android 實(shí)現(xiàn)跑馬燈效果
Android中實(shí)現(xiàn)跑馬燈效果有多種方式,本篇簡(jiǎn)單介紹下:
1: TextView屬性實(shí)現(xiàn)
<TextView
android:layout_width="150dp"
android:layout_height="wrap_content"
android:background="#77000000"
android:padding="5dp"
android:singleLine="true"
android:ellipsize="marquee"
android:scrollHorizontally="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:text="這是textview的跑馬燈效果"
android:id="@+id/tv1"
/>
這里需要注意下:
- 需要限制textview的寬度,不能設(shè)置為wrap_content
- 啟動(dòng)跑馬燈效果需要獲取焦點(diǎn)requestFocus().
2: 代碼實(shí)現(xiàn)
//設(shè)置TextView只顯示一行文本。 tv2.setSingleLine(); //設(shè)置TextView的文本內(nèi)容是否可以水平滾動(dòng)。 tv2.setHorizontallyScrolling(true); //設(shè)置當(dāng)TextView的文本內(nèi)容超出可顯示范圍時(shí)的省略方式,這里設(shè)置為跑馬燈效果。 tv2.setEllipsize(TextUtils.TruncateAt.MARQUEE); //設(shè)置跑馬燈效果重復(fù)的次數(shù),-1表示無(wú)限重復(fù)。 tv2.setMarqueeRepeatLimit(-1); //設(shè)置TextView是否可以獲取焦點(diǎn)。 tv2.setFocusable(true); //設(shè)置TextView在觸摸模式下是否可以獲取焦點(diǎn)。 tv2.setFocusableInTouchMode(true); //請(qǐng)求獲取焦點(diǎn)。 tv2.requestFocus();
3: 自定義 view實(shí)現(xiàn)
這里可以使用動(dòng)畫(huà)的效果實(shí)現(xiàn).
package com.test.marquee;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
import androidx.annotation.Nullable;
public class MarqueeView extends View {
private String text;
private Paint paint;
private float textWidth;
private float textX;
private float viewWidth;
private ValueAnimator animator;
public MarqueeView(Context context) {
super(context);
init();
}
public MarqueeView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public MarqueeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
text = “This is a marquee”;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setTextSize(50);
paint.setColor(Color.BLACK);
textWidth = paint.measureText(text);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
viewWidth = w;
textX = viewWidth;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText(text, textX, getHeight() / 2, paint);
}
public void startMarquee() {
animator= ValueAnimator.ofFloat(viewWidth, -textWidth);
animator.setDuration(5000);
animator.setInterpolator(new LinearInterpolator());
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.addUpdateListener(animation -> {
textX = (float) animation.getAnimatedValue();
invalidate();
});
animator.start();
}
public void stopMarquee() {
// 停止動(dòng)畫(huà)
if (animator!=null) animator.cancel();
}
}4: 實(shí)現(xiàn)豎直效果的跑馬燈
package com.test.marquee;
import android.content.Context;
import android.graphics.Canvas;
import android.text.TextUtils;
import android.text.method.ScrollingMovementMethod;
import android.util.AttributeSet;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;
public class VerticalMarqueeTextView extends AppCompatTextView {
private float offsetY;
public VerticalMarqueeTextView(Context context) {
super(context);
init();
}
public VerticalMarqueeTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
setSingleLine();
setEllipsize(TextUtils.TruncateAt.MARQUEE);
setMarqueeRepeatLimit(-1);
setFocusable(true);
setFocusableInTouchMode(true);
setHorizontallyScrolling(true);
setMovementMethod(ScrollingMovementMethod.getInstance());
}
@Override
protected void onDraw(Canvas canvas) {
canvas.translate(0, offsetY);
super.onDraw(canvas);
}
@Override
public boolean isFocused() {
return true;
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
post(new Runnable() {
@Override
public void run() {
offsetY -= 1;
if (offsetY <= -getHeight()) {
offsetY = 0;
}
invalidate();
postDelayed(this, 20);
}
});
}
}以上就是Android實(shí)現(xiàn)跑馬燈效果的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于Android跑馬燈的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android Studio 3.5版本JNI生成SO文件詳解
這篇文章主要介紹了Android Studio 3.5版本JNI生成SO文件詳解,想了解JNI的同學(xué),可以參考下2021-04-04
Android使用SharedPreferences存儲(chǔ)XML文件的實(shí)現(xiàn)方法
這篇文章主要介紹了Android使用SharedPreferences存儲(chǔ)XML文件的實(shí)現(xiàn)方法,實(shí)例分析了SharedPreferences類的基本初始化與文件存儲(chǔ)相關(guān)技巧,需要的朋友可以參考下2016-07-07
Android開(kāi)發(fā)中關(guān)于組件導(dǎo)出的風(fēng)險(xiǎn)及防范
這篇文章主要介紹了Android開(kāi)發(fā)中關(guān)于組件導(dǎo)出的風(fēng)險(xiǎn)及防范,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Android實(shí)現(xiàn)快遞物流時(shí)間軸效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)快遞物流時(shí)間軸效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android多線程學(xué)習(xí)實(shí)例詳解
這篇文章主要介紹了Android多線程,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android多線程的概念、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-10-10

