Android实现跑马灯效果的代码详解

 更新时间:2024年04月30日 09:22:27   作者:夏沫琅琊  
Android中实现跑马灯效果有多种方式,本文给大家介绍了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"
        />

这里需要注意下:

  • 需要限制textview的宽度,不能设置为wrap_content
  • 启动跑马灯效果需要获取焦点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);
}
});
}
}

以上就是Android实现跑马灯效果的代码详解的详细内容,更多关于Android跑马灯的资料请关注脚本之家其它相关文章!

相关文章

  • Android studio 实现随机位置画10个随机大小的五角星的代码

    Android studio 实现随机位置画10个随机大小的五角星的代码

    这篇文章主要介绍了Android studio 实现随机位置画10个随机大小的五角星,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Android中CountDownTimer类详解

    Android中CountDownTimer类详解

    本文详细讲解了Android中CountDownTimer类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Android自定义View实现圆弧进度效果逐步完成过程

    Android自定义View实现圆弧进度效果逐步完成过程

    在Android开发中,通过自定义View实现自己想要的效果是作为android开发程序员的一项必备技能,自定义View对于android开发来说也是比较难的一项技术
    2023-04-04
  • OpenGL实现Bezier曲线的方法示例

    OpenGL实现Bezier曲线的方法示例

    今天小编就为大家分享一篇关于OpenGL实现Bezier曲线的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 新手必看Android Studio入门详解

    新手必看Android Studio入门详解

    上篇文章已经说过了Android Studio的安装配置,这篇文章主要介绍了Android Studio入门详解以及一些常见的报错,新手同学一起从这里开始完成我们的第一个Android项目吧!
    2021-08-08
  • Android开发实现的内存管理工具类

    Android开发实现的内存管理工具类

    这篇文章主要介绍了Android开发实现的内存管理工具类,可实现计算手机内部与外部的总存储空间、可用存储空间等功能,需要的朋友可以参考下
    2017-11-11
  • DrawerLayout的简单使用及侧滑菜单实现详解

    DrawerLayout的简单使用及侧滑菜单实现详解

    这篇文章主要为大家介绍了DrawerLayout的简单使用及侧滑菜单实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 详解android webView独立进程通讯方式

    详解android webView独立进程通讯方式

    本篇文章主要介绍了android webView独立进程通讯方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Android ListView实现下拉顶部图片变大效果

    Android ListView实现下拉顶部图片变大效果

    这篇文章主要为大家详细介绍了Android ListView实现下拉顶部图片变大,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android实现粒子中心扩散动画效果

    Android实现粒子中心扩散动画效果

    粒子动画效果相比其他动画来说是非常复杂了的,主要涉及三个方面,粒子初始化、粒子位移、粒子回收等问题,本篇将实现两种动画效果,代码基本相同,只是旋转速度不一样,需要的朋友可以参考下
    2024-02-02

最新评论