Android基于TextView實(shí)現(xiàn)的跑馬燈效果實(shí)例
本文實(shí)例講述了Android基于TextView實(shí)現(xiàn)的跑馬燈效果。分享給大家供大家參考,具體如下:
package sweet.venst.act; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.Display; import android.view.View; import android.view.WindowManager; import android.view.View.MeasureSpec; import android.view.View.OnClickListener; import android.widget.TextView; public class AutoScrollTextView extends TextView { public final static String TAG = AutoScrollTextView.class.getSimpleName(); private float textLength = 0f;// 文本長度 private int viewWidth = 0; private int viewHight = 300; private float step = 0f;// 文字的橫坐標(biāo) private float y = 0f;// 文字的縱坐標(biāo) private float temp_view_plus_text_length = 0.0f;// 用于計(jì)算的臨時(shí)變量 private float temp_view_plus_two_text_length = 0.0f;// 用于計(jì)算的臨時(shí)變量 public boolean isStarting = false;// 是否開始滾動(dòng) private Paint paint = null;// 繪圖樣式 private String text = "";// 文本內(nèi)容 public AutoScrollTextView(Context context) { super(context); } public AutoScrollTextView(Context context, AttributeSet attrs) { super(context, attrs); } public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); int measureWidth = measureWidth(widthMeasureSpec); int measureHight = measureHeight(heightMeasureSpec); // int measureWidth = 1024; // int measureHight = 300; viewWidth = measureWidth; viewHight = measureHight; setMeasuredDimension(viewWidth, viewHight); } private int measureWidth(int widthMeasureSpec) { int specMode = MeasureSpec.getMode(widthMeasureSpec); int specSize = MeasureSpec.getSize(widthMeasureSpec); if (specMode == MeasureSpec.UNSPECIFIED) { return viewWidth; } else { return viewWidth; } } private int measureHeight(int widthMeasureSpec) { int specMode = MeasureSpec.getMode(widthMeasureSpec); int specSize = MeasureSpec.getSize(widthMeasureSpec); if (specMode == MeasureSpec.UNSPECIFIED) { return viewHight; } else { return viewHight; } } public void setScrollText(String text) { this.text = text; inittextLength(text); // invalidate(); } public void init(Context cx) { paint = getPaint(); paint.setTextSize(40); paint.setColor(Color.WHITE); text = getText().toString(); textLength = paint.measureText(text); viewWidth = getWidth(); if (viewWidth == 0) { DisplayMetrics dm = new DisplayMetrics(); dm = cx.getApplicationContext().getResources().getDisplayMetrics(); viewWidth = dm.widthPixels; } step = textLength; temp_view_plus_text_length = viewWidth + textLength; temp_view_plus_two_text_length = viewWidth + textLength * 2; y = getTextSize() + getPaddingTop(); } private void inittextLength(String text) { textLength = paint.measureText(text); step = textLength; temp_view_plus_text_length = viewWidth + textLength; temp_view_plus_two_text_length = viewWidth + textLength * 2; } @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]; } 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(); } public void onDraw(Canvas canvas) { canvas.save(); canvas.drawText(text, temp_view_plus_text_length - step, y, paint); if (!isStarting) { return; } step += 3.2;// 0.5為文字滾動(dòng)速度。 if (step > temp_view_plus_two_text_length) step = textLength; canvas.restore(); // invalidate(); postInvalidate(); } }
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
- Android TextView實(shí)現(xiàn)跑馬燈效果的方法
- Android 中TextView中跑馬燈效果的實(shí)現(xiàn)方法
- Android 實(shí)現(xiàn)不依賴焦點(diǎn)和選中的TextView跑馬燈
- Android基于TextView不獲取焦點(diǎn)實(shí)現(xiàn)跑馬燈效果
- Android中使用TextView實(shí)現(xiàn)文字跑馬燈效果
- Android基于TextView屬性android:ellipsize實(shí)現(xiàn)跑馬燈效果的方法
- Android TextView跑馬燈效果實(shí)現(xiàn)方法
- Android自定義textview實(shí)現(xiàn)豎直滾動(dòng)跑馬燈效果
- Android使用TextView跑馬燈效果
- Android自定義控件ViewFipper實(shí)現(xiàn)豎直跑馬燈效果
相關(guān)文章
Android 自定義圓形頭像CircleImageView支持加載網(wǎng)絡(luò)圖片的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 自定義圓形頭像CircleImageView支持加載網(wǎng)絡(luò)圖片的實(shí)現(xiàn)代碼,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10Android RelativeLayout相對布局屬性簡析
在Android應(yīng)用開發(fā)過程中,為了界面的美觀考慮,經(jīng)常會使用到布局方面的屬性,本文就以此問題深入解析,詳解一下Android RelativeLayout相對布局屬性在實(shí)際開發(fā)中的應(yīng)用,需要的朋友可以參考下2012-11-11Android實(shí)現(xiàn)Back功能代碼片段總結(jié)
今天把在公司實(shí)現(xiàn)某功能所用到的Back鍵功能模塊代碼片段做一個(gè)整理。方便以后直接拿出來使用2014-09-09Android實(shí)現(xiàn)可拖拽帶有坐標(biāo)尺進(jìn)度條的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Android實(shí)現(xiàn)可拖拽帶有坐標(biāo)尺進(jìn)度條的效果,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下2023-06-06詳解Android控件之DatePicker、TimePicker探究
本篇文章主要介紹了Android控件之DatePicker、TimePicker探究,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12android中g(shù)zip數(shù)據(jù)壓縮與網(wǎng)絡(luò)框架解壓縮
這篇文章主要為大家介紹了android中g(shù)zip數(shù)據(jù)壓縮與網(wǎng)絡(luò)框架解壓縮實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android實(shí)現(xiàn)層疊卡片式banner
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)層疊卡片式banner,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Android Intent調(diào)用 Uri的方法總結(jié)
這篇文章主要介紹了Android Intent調(diào)用 Uri的方法總結(jié)的相關(guān)資料,這里整理了Android Intent 調(diào)用Uri的常用方法,需要的朋友可以參考下2017-09-09