Android自定义TextView跑马灯效果

 更新时间:2017年05月25日 16:44:15   作者:a15838319826  
这篇文章主要为大家详细介绍了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(); 
} 
} 


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 如何让安卓(Android)子控件超出父控件的范围显示

    如何让安卓(Android)子控件超出父控件的范围显示

    下面我们来看一下关于安卓(Android)子控件超出父控件的范围显示出来的方法,希望这篇文章能够帮助到各位安卓(Android)的开发者们,有碰到此问题的朋友可以进来看看哦。
    2016-08-08
  • Flutter实现旋转扫描效果

    Flutter实现旋转扫描效果

    这篇文章主要介绍了通过Flutter RotationTransition实现雷达旋转扫描的效果,文中的示例代码讲解详细,感兴趣的同学可以动手试一试
    2022-01-01
  • android开发修改状态栏背景色和图标颜色的示例

    android开发修改状态栏背景色和图标颜色的示例

    本篇文章主要介绍了android开发修改状态栏背景色和图标颜色的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Android应用实现点击按钮震动

    Android应用实现点击按钮震动

    这篇文章主要为大家详细介绍了Android应用实现点击按钮震动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Android实现点汇聚成字的动态效果详解

    Android实现点汇聚成字的动态效果详解

    在引入 fl_chart 绘制图表的时候,看到插件有下面这样的动效,随机散乱的圆点最后组合成了 Flutter 的 Logo,挺酷炫的。本篇我们来探讨类似的效果怎么实现
    2022-07-07
  • Android编程获取网络连接方式及判断手机卡所属运营商的方法

    Android编程获取网络连接方式及判断手机卡所属运营商的方法

    这篇文章主要介绍了Android编程获取网络连接方式及判断手机卡所属运营商的方法,涉及Android针对网络的判断及本机信息的获取技巧,需要的朋友可以参考下
    2016-01-01
  • Android View实现圆形进度条

    Android View实现圆形进度条

    这篇文章主要为大家详细介绍了Android View实现圆形进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 安卓APP测试之使用Burp Suite实现HTTPS抓包方法

    安卓APP测试之使用Burp Suite实现HTTPS抓包方法

    这篇文章主要介绍了安卓APP测试之使用Burp Suite实现HTTPS抓包方法,本文详解讲解了测试环境和各个软件的配置方法,需要的朋友可以参考下
    2015-04-04
  • Android自定义手机界面状态栏实例代码

    Android自定义手机界面状态栏实例代码

    我们知道IOS上的应用,状态栏的颜色总能与应用标题栏颜色保持一致,用户体验很不错,那安卓是否可以呢?若是在安卓4.4之前,答案是否定的,但在4.4之后,谷歌允许开发者自定义状态栏背景颜色啦,这是个不错的体验
    2017-03-03
  • Android自定义ListView实现仿QQ可拖拽列表功能

    Android自定义ListView实现仿QQ可拖拽列表功能

    这篇文章主要介绍了Android自定义ListView实现仿QQ可拖拽列表功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08

最新评论