android 文字闪烁换色,Android自定义文字闪烁渐变色的跑马灯

最近因为项目需要,一直都在寻找比较贴合项目主题的跑马灯,但是写的demo都是可以运行的,但是整合到项目中的时候就不起作用了,看了许多的资料,最后总结这都是线程的问题,后来各种捣腾,终于写出了一个比较合适的跑马灯,整合到项目中也是可以运行的,希望大神能多多指点

自定义一个控件src/MarqueeTextView.java

package com.example.test_marquee;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.CornerPathEffect;

import android.graphics.LinearGradient;

import android.graphics.Paint;

import android.graphics.Shader;

import android.graphics.Shader.TileMode;

import android.os.Parcel;

import android.os.Parcelable;

import android.util.AttributeSet;

import android.view.Display;

import android.view.WindowManager;

import android.widget.TextView;

public class MarqueeTextView extends TextView {

private float length1;

private float textLength;

private float viewWidth;

private float step;

private float y;

private float length2;

public boolean isStarting;

private Paint paint;

private String text;

public MarqueeTextView(Context context) {

super(context);

}

public MarqueeTextView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

public void init(WindowManager windowManager) {

paint = getPaint();

Shader shader = new LinearGradient(0, 0, 800, 50, new int[] {

Color.GREEN, Color.argb(255, 237, 145, 33),

Color.argb(255, 255, 0, 255), Color.argb(255, 218, 112, 214),

Color.argb(255, 255, 99, 71), Color.argb(255, 124, 252, 0),

Color.RED }, null, TileMode.CLAMP);

paint.setShader(shader);

paint.setPathEffect(new CornerPathEffect(10));

text = getText().toString();

textLength = paint.measureText(text);

viewWidth = getWidth();

if (viewWidth == 0) {

if (windowManager != null) {

Display display = windowManager.getDefaultDisplay();

viewWidth = display.getWidth();

}

}

step = textLength;

length2 = viewWidth + textLength;

length1 = 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 CREATOR = new Parcelable.Creator() {

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, length2 - step, y, paint);

if (!isStarting) {

return;

}

step += 5.0;

if (step > length1)

step = textLength;

invalidate();

}

}

在XML中的使用

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_marginTop="100dp"

android:layout_height="wrap_content"

android:text="世上只有一种英雄主义,就是在认清生活真相之后依然热爱生活"

android:singleLine="true"

android:textSize="20sp"

android:background="@android:color/white"

android:id="@+id/marquee_text"/>

在MainActivity中的使用

package com.example.test_marquee;

import android.app.Activity;

import android.os.Bundle;

public class MainActivity extends Activity {

private MarqueeTextView autoScrollTextView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

autoScrollTextView = (MarqueeTextView) findViewById(R.id.marquee_text);

autoScrollTextView.init(getWindowManager());

autoScrollTextView.startScroll();

}

}

如果需要更该跑马灯的中的文字只需要

autoScrollTextView.setText("");

autoScrollTextView.init(getWindowManager());

效果如下

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值