1. 程式人生 > >實現TextView自動左右滾動文字

實現TextView自動左右滾動文字

實現效果如下:自動滾動TextView效果圖

使用方法如下:
在用到的XML 中和使用普通TextView一樣定義

 <com.example.harvin.mymenu_1.AutoScrollTextView
        android:id="@+id/TextViewNotice"
        android:layout_width="fill_parent"
        android:layout_height="30px"
        android:layout_marginTop="100dp"
        android:background="#EEE"
        android:inputType="text"
android:text="Test,Test,Test,Test" android:textColor="#000" android:textSize="20px"></com.example.harvin.mymenu_1.AutoScrollTextView>

在java 檔案中使用如下:

 autoScrollTextView = (AutoScrollTextView) findViewById(R.id.TextViewNotice);
        autoScrollTextView.init(getWindowManager());

如果改變文字內容或效果,在呼叫setText()後,需要呼叫init方法初始化,不然,不能出現想要的效果。

原始碼如下:

package com.example.harvin.mymenu_1;

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.widget.TextView; import org.w3c.dom.Text; /** * Created by 黃阿懶 on 2015/12/3. */ public class AutoScrollTextView extends TextView implements View.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 String text = "";//文字內容 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);//給該空間本身註冊單擊監聽 } /** * 初始化 該方法使用該控制元件的物件呼叫 * @param windowManager */ public void init(WindowManager windowManager) { paint = getPaint(); text = getText().toString(); textLength = paint.measureText(text); viewWidth = getWidth(); if (viewWidth == 0) {//寬度為0使用預設寬度 if (windowManager != null) { Display display = windowManager.getDefaultDisplay(); viewWidth = display.getWidth(); } } step = textLength; temp_view_plus_text_length = viewWidth + textLength; temp_view_plus_two_text_length = viewWidth + textLength * 2; y = getTextSize() + getPaddingTop(); } @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) { canvas.drawText(text, temp_view_plus_text_length - step, y, paint); if (!isStarting) { return; } step += 0.5;//0.5為文字滾動速度。 if (step > temp_view_plus_two_text_length) step = textLength; invalidate(); } @Override public void onClick(View v) { if (isStarting) stopScroll();//停止滾動 else startScroll();//開始滾動 } }

END