您的位置:首页 > 其它

自定义TextView跑马灯效果可控制启动/停止/速度/焦点

2016-12-13 11:46 375 查看
Android自带的跑马灯效果不太好控制,不能控制速度,不能即时停止和启动,而且还受焦点的影响蛋疼不已。由于项目需求需要用的可控制性高的跑马灯效果,所以自己写了一个自定义的TextView 

注意:在布局文件引用本view时,paddingLeft,paddingRigh都必须为0dp,需要增加这两个属性的,大家可以自行修改代码。 
android:ellipsize="marquee" android:singleLine="true" 这两个属性也要加上

代码如下:

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

// TODO Auto-generated constructor stub 



public MarqueeText(Context context, AttributeSet attrs) { 

super(context, attrs); 



public MarqueeText(Context context, AttributeSet attrs, int defStyle) { 

super(context, attrs, defStyle); 



@Override 

protected void onDraw(Canvas canvas) { 

// TODO Auto-generated method stub 

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; 

// return; 



postDelayed(this, 5); 



// 开始滚动 

public void startScroll() { 

isStop = false; 

this.removeCallbacks(this); 

post(this); 



// 停止滚动 

public void stopScroll() { 

isStop = true; 



// 从头开始滚动 

public void startFor0() { 

currentScrollX = 0; 

startScroll(); 





布局文件: 

复制代码代码如下:

<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="startFor0" 

android:text="从头开始" /> 

<simtice.demo.marqueetext.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:textColor="#000000" 

android:textSize="20dp" > 

</simtice.demo.marqueetext.MarqueeText> 

</LinearLayout> 

MainActivity 

复制代码代码如下:

public class MainActivity extends Activity { 

private MarqueeText test; 

@Override 

public void onCreate(Bundle savedInstanceState) { 

super.onCreate(savedInstanceState); 

setContentView(R.layout.activity_main); 

test = (MarqueeText) this.findViewById(R.id.test); 



public void start(View v) { 

test.startScroll(); 



public void stop(View v) { 

test.stopScroll(); 



public void startFor0(View v){ 

test.startFor0(); 



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: