Android自定义TextView跑马灯效果
作者:a15838319826 发布时间:2023-08-07 01:14:57
标签:Android,TextView,跑马灯
Android自带的跑马灯效果不太好控制,还必须要满足条件才能有效果,而且速度不受控制。前面我的博客中有一篇就是用Android自带的跑马灯效果的,但是基于不同的使用效果,这里在网上找到了一个更好的方法。沿用了作者的一些方法,但是添加了更好的扩展功能,和大家一起分享。这里面有控制往左往右两个方向的实现。
1、首先是简单的布局main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="start"
android:text="开始" />
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="stop"
android:text="停止" />
<Button
android:id="@+id/startfor0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="startFromHead"
android:text="重置" />
<com.xuhui.customrolllight.MarqueeText
android:id="@+id/test"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#339320"
android:ellipsize="marquee"
android:singleLine="true"
android:text="滚动效果,不管多少字"
android:ellipsize = "marquee" // 跑马灯效果,字数不超过就不动,超过就滚动
android:textColor="#000000"
android:textSize="20dp" >
</com.xuhui.customrolllight.MarqueeText>
</LinearLayout>
2、自定义滚动方法MarqueeText.Java
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;
public class MarqueeText extends TextView implements Runnable {
private int currentScrollX; // 当前滚动的位置
private boolean isStop = false;
private int textWidth;
private boolean isMeasure = false;
public MarqueeText(Context context) {
super(context);
}
public MarqueeText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueeText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
currentScrollX = this.getWidth();
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!isMeasure) {
getTextWidth();// 文字宽度只需要获取一次就可以了
isMeasure = true;
}
}
private void getTextWidth() {
Paint paint = this.getPaint();
String str = this.getText().toString();
textWidth = (int) paint.measureText(str);
}
@Override
/*
* public void run() { currentScrollX-=2;//滚动速度.+号表示往左边-
* scrollTo(currentScrollX,0); if(isStop){ return; }
* if(getScrollX()<=-(this.getWidth())){ scrollTo(textWidth,0);
* currentScrollX=textWidth; } postDelayed(this, 5); }
*/
public void run() {
currentScrollX += 2;// 滚动速度.+号表示往左边-
scrollTo(currentScrollX, 0);
if (isStop) {
return;
}
if (getScrollX() >= (textWidth)) {
currentScrollX = -(this.getWidth());// 当前出现的位置
}
postDelayed(this, 1);
}
/*( public void run() {
// currentScrollX += 3;// 滚动速度.+号表示往左边-
// scrollTo(currentScrollX, 0);
if (textWidth>this.getWidth()) {
currentScrollX += 3;// 滚动速度.+号表示往左边-
scrollTo(currentScrollX, 0);
}
if (getScrollX() >= (textWidth)) {
// scrollTo(this.getWidth(),0);
currentScrollX = -(this.getWidth());// 当前出现的位置
}
postDelayed(this, 5);
})这里面实现的是没有省略号的效果。文字没有超出框的长度就不滚,超出就滚*/
// 开始滚动
public void startScroll() {
isStop = false;
this.removeCallbacks(this);
post(this);
}
// 停止滚动
public void stopScroll() {
isStop = true;
}
// 从头开始滚动
public void startFromHead() {
currentScrollX = 0;
startScroll();
}
}
上面注释掉的代码是实现文字往右边跑
3、下面是主程序MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
private MarqueeText test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test=(MarqueeText) findViewById(R.id.test);
}
public void start(View v){
test.startScroll();
}
public void stop(View v){
test.stopScroll();
}
public void startFromHead(View v){
test.startFromHead();
}
}


猜你喜欢
- Wrapper---条件查询器:使用它可以实现很多复杂的查询1.条件查询1.1查询name不为空的用户,并且邮箱不为空的用户,年龄大于等于1
- 本文分析了Android编程中出现The connection to adb is down问题的解决方法。分享给大家供大家参考,具体如下:
- 我们在SpringBoot和MyBatis整合的时候,需要在SpringBoot中通过注解方式配置事务回滚1 Pojo类package co
- 作为开发人员,掌握开发环境下的调试技巧十分有必要。我们在编写java程序的过程中,经常会遇到各种莫名其妙的问题,为了检测程序是哪里出现问题,
- 本文实例讲述了C#设置输入法的方法。分享给大家供大家参考。具体如下:private void Form1_Load(object sende
- java超市管理系统 1.0(含源文件,后续会继续优化~)前言一个月零零散散的时间学习了java,通过这次“超市管理系统”的练习,希望可以给
- java arrayList遍历的四种方法及Java中ArrayList类的用法package com.test;import java.u
- 前言列表是移动应用中用得最多的组件了,我们也会经常对列表元素进行增加或删除操作,最简单的方法是列表数据变动后,直接 setStat
- 接着上一篇继续,老铁们1.检查数组的有序性给定一个整型数组, 判断是否该数组是有序的(升序) public static bo
- 前言:CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。例如,应用程序的主线程希望在负
- 现阶段的问题现在是云原生和容器化时代,.NET Core对于云原生来说有非常好的兼容和亲和性,dotnet社区以及微软为.NET Core提
- 前言在实际开发当中,对于某些关键业务,我们通常需要记录该操作的内容,一个操作调一次记录方法,每次还得去收集参数等等,会造成大量代码重复。 我
- 目录一.简单数组之一维数组1.数组的声明2.数组的初始化3.访问数组元素4.数组中使用引用类型二.多维数组三.锯齿数组四.Array类1.创
- 【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1
- 1.前言string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢?原因就是
- 本文实例讲述了JAVA线程池原理。分享给大家供大家参考,具体如下:线程池的优点1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每
- Java执行cmd命令//当前绝对路径System.out.println(IoUtil.read(Runtime.getRuntime()
- Spring框架的关键组件是面向方面编程(AOP)框架。面向方面的编程不仅打破程序逻辑分成不同的部分称为所谓的担忧。跨越多个点的应用程序的功
- 汉诺塔的规则是:一共三根柱子,一根柱子从上到
- Java中重载与重写的区别首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的