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);}@Overrideprotected 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>