第一篇文章小白一名直接上代码吧
第一步:这个是自定义跑马灯的类
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();
}
}