读书人

自定义TextView兑现跑马灯效果

发布时间: 2013-01-19 11:41:36 作者: rapoo

自定义TextView实现跑马灯效果

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>


读书人网 >移动开发

热点推荐