自定義具有跑馬燈效果的兩種方法
阿新 • • 發佈:2019-01-03
普通的TextView可以實現跑馬燈,但是隻有當焦點在它上面時才有效。如何做一個自動的跑馬燈呢?第一種:繼承TextView,然後重寫isFocused()方法就可以了,簡單!Java程式碼 第2種:還是繼承TextView,重寫onDraw(),在onDraw中不停的重繪。
Java程式碼
第1種跑馬燈不能設定速度,並且要超過一行才會滾動。
第2種跑馬燈只能設定單一顏色,且需要在程式碼中設定,不能同時設定多種顏色。速度設的不要過大(<=2.0f),否則停頓現象比較明顯。
使用時同TextView一樣:Xml程式碼import android.content.Context; import android.util.AttributeSet; import android.widget.TextView; public class ScrollForeverTextView extends TextView { public ScrollForeverTextView(Context context) { super(context); // TODO Auto-generated constructor stub } public ScrollForeverTextView(Context context, AttributeSet attrs) { super(context, attrs); } public ScrollForeverTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean isFocused() { return true; } }
<com.ql.view.ScrollForeverTextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30px" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:textColor="@color/red" android:text="1234567890wwwwwwwwwwwwwwwwwwwwww1234567890" android:focusable="true" />
Java程式碼
使用:Java程式碼import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; import android.view.Display; import android.view.View; import android.view.WindowManager; import android.view.View.OnClickListener; import android.widget.TextView; public class AutoScrollTextView extends TextView implements OnClickListener { public final static String TAG = AutoScrollTextView.class.getSimpleName(); private float textLength = 0f;// 文字長度 private float viewWidth = 0f; private float step = 0f;// 文字的橫座標 private float y = 0f;// 文字的縱座標 private float temp_view_plus_text_length = 0.0f;// 用於計算的臨時變數 private float temp_view_plus_two_text_length = 0.0f;// 用於計算的臨時變數 public boolean isStarting = false;// 是否開始滾動 private Paint paint = null;// 繪圖樣式 private CharSequence text = "";// 文字內容 private float speed = 0.5f; private int textColor=0xFF000000; public int getTextColor() { return textColor; } public void setTextColor(int color) { this.textColor = color; } public float getSpeed() { return speed; } public void setSpeed(float speed) { this.speed = speed; } public AutoScrollTextView(Context context) { super(context); initView(); } public AutoScrollTextView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView(); } private void initView() { setOnClickListener(this); } public void init(float width) { text=super.getText(); paint = super.getPaint(); // Paint paint=new Paint(); text = getText().toString(); textLength = paint.measureText(text.toString()); // viewWidth = getWidth(); // if (viewWidth == 0) { // if (windowManager != null) { // Display display = windowManager.getDefaultDisplay(); // viewWidth = display.getWidth(); // } // } viewWidth=width; step = textLength; temp_view_plus_text_length = viewWidth + textLength; temp_view_plus_two_text_length = viewWidth + textLength * 2; y = getTextSize() + getPaddingTop(); paint.setColor(textColor); } @Override public Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); SavedState ss = new SavedState(superState); ss.step = step; ss.isStarting = isStarting; return ss; } @Override public void onRestoreInstanceState(Parcelable state) { if (!(state instanceof SavedState)) { super.onRestoreInstanceState(state); return; } SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); step = ss.step; isStarting = ss.isStarting; } public static class SavedState extends BaseSavedState { public boolean isStarting = false; public float step = 0.0f; SavedState(Parcelable superState) { super(superState); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeBooleanArray(new boolean[] { isStarting }); out.writeFloat(step); } public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { public SavedState[] newArray(int size) { return new SavedState[size]; } @Override public SavedState createFromParcel(Parcel in) { return new SavedState(in); } }; private SavedState(Parcel in) { super(in); boolean[] b = null; in.readBooleanArray(b); if (b != null && b.length > 0) isStarting = b[0]; step = in.readFloat(); } } public void startScroll() { isStarting = true; invalidate(); } public void stopScroll() { isStarting = false; invalidate(); } @Override public void onDraw(Canvas canvas) { // super.onDraw(canvas); canvas.drawText(text,0,text.length(), temp_view_plus_text_length - step, y, paint); if (!isStarting) { return; } step += speed; if (step > temp_view_plus_two_text_length) step = textLength; invalidate(); } @Override public void onClick(View v) { if (isStarting) stopScroll(); else startScroll(); } }
marquee = (AutoScrollTextView) findViewById(R.id.marquee);
// marquee.setText(String.format(getResources().getString(R.string.marquee0),Consts.termno,"2010-12-28"));
marquee.setText("上證指數3000.15 6.81(0.37%)深圳成指3000.15 6.81(0.37%)");
// marquee.setTextColor(0xffff0000);//注意:顏色必須在這裡設定,xml中設定無效!預設黑色。
//如果想改變跑馬燈的文字內容或者文字效果,則在呼叫完setText方法之後,需要再呼叫一下init(width)方法,重新進行初始化和相關引數的計算。
marquee.setSpeed(1.5f);
marquee.init(width);//width通常就是螢幕寬!
marquee.startScroll();
這2種跑馬燈稍微有點區別,需要掂量著使用。第1種跑馬燈不能設定速度,並且要超過一行才會滾動。
第2種跑馬燈只能設定單一顏色,且需要在程式碼中設定,不能同時設定多種顏色。速度設的不要過大(<=2.0f),否則停頓現象比較明顯。