Android 개발: TextView 가 진정 으로 제어 할 수 있 고 초점 이 필요 없 는 수평 스크롤 - 이것 이 야 말로 진정한 주마등 입 니 다.

인터넷 의 TextView 는 주마등 을 만 들 때 대부분 초점 을 사용 해 야 하 며, 글자 수 는 굴 러 가 는 구역 의 너 비 를 초과 해 야 굴 러 가 는 것 을 실현 할 수 있어 사용 하기에 매우 불편 하 다.
이곳 은 진정 으로 제어 할 수 있 는 스크롤 을 실현 한다.
(1) 초점 필요 없 음
(2) 임 의 글자 수
(3) 스크롤 영역 오른쪽 에서 나 오고 왼쪽 에서 사라 지고 오른쪽 에서 나 옵 니 다.
상위 코드
1. 레이아웃 파일
<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"
    tools:context="${relativePackage}.${activityClass}" >

   <Button 
       android:id="@+id/btn1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="      1"/>
      <Button 
       android:id="@+id/btn2"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_toRightOf="@id/btn1"
       android:text="      2"/>
       <Button 
       android:id="@+id/btn3"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_toRightOf="@id/btn2"
       android:text="    "/>
        <com.using.margindemo.MarqueeTextView
        android:id="@+id/tvScroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40dp" >
    </com.using.margindemo.MarqueeTextView>
</RelativeLayout>

 
2. 스크롤 컨트롤
package com.using.margindemo;

import android.content.Context;
import android.graphics.Canvas;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.TextView;

public class MarqueeTextView extends TextView {

    /**        */
    private boolean mStopMarquee;
    private String mText;//    
    private float mCoordinateX = 1280;//      
    private float mTextWidth;//    
    private int mScrollWidth = 1280;//      
    private int speed = 1;//    
    public float getCurrentPosition() {
        return mCoordinateX;
    }

    public void setCurrentPosition(float mCoordinateX) {
        this.mCoordinateX = mCoordinateX;
    }

    public int getScrollWidth() {
        return mScrollWidth;
    }

    public void setScrollWidth(int mScrollWidth) {
        this.mScrollWidth = mScrollWidth;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public MarqueeTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setText(String text) {
        this.mText = text;
        mTextWidth = getPaint().measureText(mText);
        //mTextWidth = 1280;
        if (mHandler.hasMessages(0))
            mHandler.removeMessages(0);
        mHandler.sendEmptyMessageDelayed(0, 10);
    }


    @Override
    protected void onAttachedToWindow() {
        mStopMarquee = false;
        if (!isEmpty(mText))
            mHandler.sendEmptyMessageDelayed(0, 2000);
        super.onAttachedToWindow();
    }

    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

    @Override
    protected void onDetachedFromWindow() {
        mStopMarquee = true;
        if (mHandler.hasMessages(0))
            mHandler.removeMessages(0);
        super.onDetachedFromWindow();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (!isEmpty(mText))
            canvas.drawText(mText, mCoordinateX, 150, getPaint());
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 0:                    
                if (mCoordinateX < (-mTextWidth)) {//
                    mCoordinateX = mScrollWidth;
                    invalidate();
                    if (!mStopMarquee) {
                    sendEmptyMessageDelayed(0, 500);
                    }
                } else {
                    mCoordinateX -= speed;
                    invalidate();
                    if (!mStopMarquee) {
                        sendEmptyMessageDelayed(0, 30);
                    }
                }

                break;
            }
            super.handleMessage(msg);
        }
    };

}

 
3、
package com.using.margindemo;

import android.app.ActionBar;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
    private ImageView image;
    private MarqueeTextView marqueeTextView;
    private Button button1;
    private Button button2;
    private Button button3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);//     
        setContentView(R.layout.activity_main);        
        
        marqueeTextView = (MarqueeTextView)findViewById(R.id.tvScroll);        
        
        MarginLayoutParams margin1 = new MarginLayoutParams(
                marqueeTextView.getLayoutParams());
        margin1.setMargins(100, 200, 0, 0);//        :    400  ,   10     
        RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(margin1);
        layoutParams1.height = 240;//       
        layoutParams1.width = 1000; //        
        marqueeTextView.setLayoutParams(layoutParams1);                
        marqueeTextView.setScrollWidth(1000);
        marqueeTextView.setCurrentPosition(100 + 1000);//                
        marqueeTextView.setSpeed(2);
        marqueeTextView.setText("           !");
        button1 = (Button)findViewById(R.id.btn1);
        button2 = (Button)findViewById(R.id.btn2);
        button3 = (Button)findViewById(R.id.btn3);        
        button1.setOnClickListener(new OnClickListener() {            
            @Override
            public void onClick(View v) {
                marqueeTextView.setText("           !");                
            }
        });
        
         button2.setOnClickListener(new OnClickListener() {            
            @Override
            public void onClick(View v) {
                marqueeTextView.setText("    :      ,       ,         ,         ,  !");
                
            }
        });
         button3.setOnClickListener(new OnClickListener() {            
             @Override
             public void onClick(View v) {
                 finish();
             }
         });
    }
}

 
 
데모 다운로드

좋은 웹페이지 즐겨찾기