mainActivity如下:
package c.x; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button mStartbButton; private Button mPauseButton; private Button mRestartbButton; private MarqueeText mMarqueeText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init(){ mMarqueeText=(MarqueeText) findViewById(R.id.marqueeText); mStartbButton=(Button) findViewById(R.id.start_Button); mStartbButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mMarqueeText.startScroll(); } }); mPauseButton=(Button) findViewById(R.id.pause_Button); mPauseButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mMarqueeText.pauseScroll(); } }); mRestartbButton=(Button) findViewById(R.id.restart_Button); mRestartbButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mMarqueeText.restartScroll(); } }); } }
MarqueeText如下:
package c.x; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.TextView; /** * 需求描述: * TextView跑马灯的实现 * * 实现原理: * 通过不断的scrollTo()显示View中不同坐标处的内容 * *遇到的问题 *1 注意scrollTo(int x, int y) * 移动View中内容,比如此处TextView中的文字. * x the x position to scroll to * y the y position to scroll to * *2 scrollTo(int x, int y)的坐标问题 * 参考资料: * http://www.open-open.com/lib/view/open1328834050046.html * 个人理解: * 该坐标为View中的内容的坐标.该坐标的起始点虽然在内容的左上角 * 但是Y轴的正向是竖直向上的,X轴水平向右. * 该理解待于进一步验证. * */ public class MarqueeText extends TextView implements Runnable { private int contentWidth=0; private int scrollToX=0; private boolean isStop=false; private boolean isRun=true; private boolean isMeasureContentWidth=false; public MarqueeText(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (!isMeasureContentWidth) { //获取文字长度 Paint paint=this.getPaint(); String content=this.getText().toString(); contentWidth=(int) paint.measureText(content); isMeasureContentWidth=true; } } public void run() { if (isRun) { if (scrollToX>=contentWidth) { //重新开始 scrollToX=-150; } scrollTo(scrollToX, 0); scrollToX=scrollToX+5; postDelayed(this, 150); } } // 点击开始,执行线程 public void startScroll() { post(this); } // 点击暂停 public void pauseScroll() { isRun=false; } // 点击重新开始 public void restartScroll() { isRun=true; scrollToX=0; startScroll(); } }
main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/linerLayout" android:layout_width="match_parent" android:layout_height="80dip" android:layout_alignParentTop="true" android:orientation="horizontal" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/start_Button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:text="开始" /> <Button android:id="@+id/pause_Button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="暂停" /> <Button android:id="@+id/restart_Button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="重新开始" /> </RelativeLayout> </LinearLayout> <c.x.MarqueeText android:id="@+id/marqueeText" android:layout_width="200dip" android:layout_height="100dip" android:layout_below="@id/linerLayout" android:text="波什29分4篮板2抢断4盖帽,雷-阿伦15分" android:textColor="@android:color/black" android:background="@android:color/white" android:ellipsize="marquee" android:singleLine="true" android:gravity="center_vertical" /> </RelativeLayout>