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:andro>
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(); } }
原文:http://www.eoeandroid.com/thread-247067-1-1.html