自定義MarqueeTextView字型沒有超過螢幕大小也能實現跑馬燈效果.
阿新 • • 發佈:2018-12-14
第一篇文章小白一名直接上程式碼吧
第一步:這個是自定義跑馬燈的類
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();
}
}