当前位置:编程学习 > JAVA >>

自定义TextView实现跑马灯效果

[java]  
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如下:
 
[java]  
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如下:
 
[html]  
<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
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,