Android 实现跑马灯效果

Android 实现跑马灯效果

Android中实现跑马灯效果有多种方式,本篇简单介绍下:

1: TextView属性实现

    <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"
        />

这里需要注意下:

  1. 需要限制textview的宽度,不能设置为wrap_content
  2. 启动跑马灯效果需要获取焦点requestFocus().

2: 代码实现

//设置TextView只显示一行文本。
tv2.setSingleLine();
//设置TextView的文本内容是否可以水平滚动。
tv2.setHorizontallyScrolling(true);
//设置当TextView的文本内容超出可显示范围时的省略方式,这里设置为跑马灯效果。
tv2.setEllipsize(TextUtils.TruncateAt.MARQUEE);
//设置跑马灯效果重复的次数,-1表示无限重复。
tv2.setMarqueeRepeatLimit(-1);
//设置TextView是否可以获取焦点。
tv2.setFocusable(true);
//设置TextView在触摸模式下是否可以获取焦点。
tv2.setFocusableInTouchMode(true);
//请求获取焦点。
tv2.requestFocus();

3: 自定义 view实现

这里可以使用动画的效果实现.

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() {
// 停止动画
if (animator!=null) animator.cancel();
}
}

4: 实现竖直效果的跑马灯

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);
}
});
}
}

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值