안드로이드 텍스트 스크롤 textview

4355 단어
사용자 정의 AutoScrollTextView는 TextView로 계승되며, onDraw()에서 문자의 X축 오프셋을 1로 설정하고 새로 고침하여 문자가 오른쪽에서 왼쪽으로 이동하는 효과를 실현한다.
public class AutoScrollTextView extends TextView implements OnClickListener {

	
	private String Tag = "AutoScrollTextView";
	/**      */
	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() {
		paint = getPaint();
		setOnClickListener(this);

	}

	public void init(WindowManager windowManager) {
		L.i(Tag, "init paint ===="+paint);
		text = getText().toString();
		paint.setColor(Color.rgb(251, 163, 68));
		textLength = paint.measureText(text);
		L.e("lg", "text ==="+text);
		viewWidth = getWidth();
		if (viewWidth == 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);
			}
		};

		@SuppressWarnings("unused")
		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 += 1;// 0.5       。
		if (step > temp_view_plus_two_text_length)
			step = textLength;
		invalidate();
	}
	

	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		if (isStarting)
			stopScroll();
		else
			startScroll();

	}
	

}

xml에서 다음을 사용합니다.
<com.demo.view.AutoScrollTextView
        android:id="@+id/auto_textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:padding="5dp" />

Java에서 다음을 사용합니다.
private AutoScrollTextView auto_tv;

auto_tv = (AutoScrollTextView) findViewById(R.id.auto_textview);

auto_tv.setText(msg);
auto_tv.init(getWindowManager());
auto_tv.startScroll();

좋은 웹페이지 즐겨찾기