1. 程式人生 > >自定義MarqueeTextView字型沒有超過螢幕大小也能實現跑馬燈效果.

自定義MarqueeTextView字型沒有超過螢幕大小也能實現跑馬燈效果.

第一篇文章小白一名直接上程式碼吧
第一步:這個是自定義跑馬燈的類
public class MarqueeTextView extends android.support.v7.widget.AppCompatTextView {
/**
* 是否停止滾動
*/
private boolean mStopMarquee;
private String mText;
private float mCoordinateX = 500; //=300
private float mTextWidth;
private float mTextHeight;
private float windowWith;

private float  mStopX;// 停留觸發位置
private int    mState; // 狀態 0 停止 1 執行
private float  mStopTime = 1000; // 停留時間 ,單位秒
private float  mStopCnt; // 已近停留計數
private float  mMoveSpeed = 5; // 移動速度 ,表示每次移動多少個點
private boolean mRightFlag = false; // 文字到達右邊標誌,1 設標誌
private float windowHeight;

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

public void setText(String text)
{
    this.mText = text;

    mTextWidth = getPaint().measureText(mText);

    mTextHeight = getPaint().getFontMetrics().bottom;

    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();

    windowWith = displayMetrics.widthPixels;
    windowHeight = displayMetrics.heightPixels;

    if (mTextWidth > windowWith)
    {
        mStopX = 10; // 留點左邊空
    }
    else
    {
        mStopX = (windowWith - mTextWidth) / 2; // 居中
    }

    mState = 0; // 停止狀態
    mStopCnt = 0; // 重新計數
    mRightFlag = false;

    mCoordinateX = mStopX; // 顯示位置設成 mStopX

    invalidate();

    if (mHandler.hasMessages(0)) // 清楚前期的觸發佇列
        mHandler.removeMessages(0);

    mHandler.sendEmptyMessageDelayed(0, 10); // 啟動定時器
}


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

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

@SuppressLint("NewApi")
@Override
protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    if (!(mText == null || mText.isEmpty()))
    {
        Paint P;

        P = getPaint();

     //   P.setColor(Color.BLACK);                    //設定畫筆顏色
      //  canvas.drawColor(Color.WHITE);                  //設定背景顏色
        P.setStrokeWidth((float) 3.0);
   //mCoordinateX   getLayout().getHeight()
        canvas.drawText(mText, mCoordinateX, windowHeight/2, P);

    }
}

@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        super.handleMessage(msg);

        switch (msg.what)
        {
            case 0:

                if (mState==0)
                {
                    if (mStopCnt>mStopTime)
                    {
                        mState = 1;
                    }
                    else
                    {
                        mStopCnt++;
                    }
                }
                else
                {
                    if (mCoordinateX< 0 && Math.abs(mCoordinateX) > mTextWidth)
                    {
                        mCoordinateX = windowWith;

                        mRightFlag = true;
                    }
                    else
                    {
                        mCoordinateX -= mMoveSpeed;

                        if (mCoordinateX < mStopX && mRightFlag==true)
                        {
                            mState = 0; // 停止狀態

                            mStopCnt = 0; // 重新計數

                            mCoordinateX = mStopX;

                            mRightFlag = false;
                        }
                    }

                    invalidate();
                }

                sendEmptyMessageDelayed(0, 10);

                break;
        }
    }
};

}

第二步:這裡是layout檔案(自己把你的包名換掉)


<com.gzds.rfreviewdome.MarqueeTextView
android:id="@+id/tv"
android:textSize=“65dp”
android:textColor="#977d7d"
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
/>

第三部初始化控制元件:

public class MainActivity extends Activity {

private TextToSpeech tts;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MarqueeTextView  tv = (MarqueeTextView) findViewById(R.id.tv);
    tv.setText("漢興德勝智慧零售");
 initData();


}

}