Androidはループ再生の文字走馬灯効果を実現

3729 ワード

今日はプロジェクトで文字走馬灯の効果を実現する必要があるので、ドアに入って間もなく私もどうすればいいか分からないので、ネットで探してみましたが、先輩たちの啓発を受けて、簡単な循環放送文字の走馬灯の効果を実現しました.
まず、TextViewを継承し、Runnableインタフェースを実装するようにカスタマイズします.
public class MarqueeTextView 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);
		// TODO Auto-generated constructor stub
	}
	public MarqueeText(Context context,AttributeSet attrs,int defStyle) {
		super(context,attrs,defStyle);
		// TODO Auto-generated constructor stub
	}
	
	@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() {
		// TODO Auto-generated method stub
		currentScrollX-=2;  // Rolling speed
		scrollTo(currentScrollX, 0);
		if (isStop) {
			return;
		}
		if (getScaleX()<=-(this.getWidth())) {
			scrollTo(textWidth, 0);
			currentScrollX=textWidth;
			//return;
		}
		postDelayed(this, 5);
	}
	// start
	public void startScroll(){
		isStop=false;
		this.removeCallbacks(this);
		post(this);
	}
	// stop
	public void stopScroll(){
		isStop=true;
	}
	// Start from scratch
	public void startFor0(){
		currentScrollX=0;
		startScroll();
	}
次に、レイアウトファイルにandroid:ellipsize=「marquee」と必ず書きます.
         
 android:focusable="true"
           
 android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"(無限ループを実現)
main_activity.xml


    

        
        

        
最后,在MainActivity.java 中去实现它
public class MainActivity extends Activity {
	
	private MarqueeText text;
	private LinearLayout layout;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		text = (MarqueeText) findViewById(R.id.test);
		layout = (LinearLayout) findViewById(R.id.my_layout);
	}


	public void stop(View v) {
		text.stopScroll();
		layout.setVisibility(View.GONE);
	}

}