自定义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();


}

}

猜你喜欢

转载自blog.csdn.net/xieyaofeng/article/details/84656889
今日推荐