本文是写个文字淡入淡出切换内容的自定义Textview组件。继承
Textview组件。
效果图:
组件代码:
public class AlphaText extends TextView {
private int mDuration; //文字从出现到显示消失的时间
private int mInterval; //文字停留在中间的时长切换的间隔
private List<ScrollTextBean> mTexts; //显示文字的数据源
private int mY = 0; //文字的Y坐标
private int mAlpha =0; //文字透明度
private int mIndex = 0; //当前的数据下标
private Paint mPaintBack; //绘制内容的画笔
private Paint mPaintFront; //绘制前缀的画笔
private boolean isMove = true; //文字是否变化
private String TAG = "ADTextView";
private boolean increase =true;
public interface onClickLitener {
public void onClick(String index);
}
private onClickLitener onClickLitener;
public void setOnClickLitener(onClickLitener onClickLitener) {
this.onClickLitener = onClickLitener;
}
public AlphaText(Context context) {
this(context, null);
}
public AlphaText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
if (onClickLitener != null) {
onClickLitener.onClick(mIndex+"");
}
break;
}
return true;
}
//设置数据源
public void setmTexts(List mTexts) {
this.mTexts = mTexts;
}
//设置广告文字的停顿时间
public void setmInterval(int mInterval) {
this.mInterval = mInterval;
}
//设置文字从出现到消失的时长
public void setmDuration(int mDuration) {
this.mDuration = mDuration;
}
//设置前缀的文字颜色
public void setFrontColor(int mFrontColor) {
mPaintFront.setColor(mFrontColor);
}
//设置正文内容的颜色
public void setBackColor(int mBackColor) {
mPaintBack.setColor(mBackColor);
}
//初始化默认值
private void init() {
mDuration = 500;
mInterval = 1000;
mIndex = 0;
mPaintFront = new Paint();
mPaintFront.setAntiAlias(true);
mPaintFront.setDither(true);
mPaintFront.setTextSize(30);
mPaintBack = new Paint();
mPaintBack.setAntiAlias(true);
mPaintBack.setDither(true);
mPaintBack.setTextSize(30);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Log.i(TAG, "onSizeChanged: " + h);
}
@Override
protected void onDraw(Canvas canvas) {
if (mTexts != null) {
TextBean model = mTexts.get(mIndex);
String font = model.getmFront();
String back = model.getmBack();
//绘制前缀
Rect indexBound = new Rect();
mPaintFront.getTextBounds(font, 0, font.length(), indexBound);
//绘制内容文字
Rect contentBound = new Rect();
mPaintBack.getTextBounds(back, 0, back.length(), contentBound);
if (mAlpha == 0 ) {
increase = true;
}else if(mAlpha == 255 ){
increase =false;
}
// if(mAlpha >255){
// mAlpha =0;
// }
mPaintBack.setAlpha(mAlpha);
mPaintFront.setAlpha(mAlpha);
mY = getMeasuredHeight() / 2 - (indexBound.top + indexBound.bottom) / 2;
canvas.drawText(back, 0, back.length(), (indexBound.right - indexBound.left) + 20, mY, mPaintBack);
canvas.drawText(font, 0, font.length(), 10, mY, mPaintFront);
if (mAlpha ==255) {
isMove = false;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
postInvalidate();
isMove = true;
}
}, mInterval);
}
if(increase){
mAlpha += 3;
}else {
mAlpha -= 3;
}
if (mAlpha == 0) {
mIndex++;
}
//循环使用数据
if (mIndex == mTexts.size()) {
mIndex = 0;
}
if (isMove) {
postInvalidate();
}
}
}
}
bean 代码:
public class TextBean {
private String mFront ; //前面的文字
private String mBack ; //后面的文字
private String mUrl ;//包含的链接
public ScrollTextBean(String mFront, String mBack,String mUrl) {
this.mFront = mFront;
this.mBack = mBack;
this.mUrl = mUrl;
}
public String getmUrl() {
return mUrl;
}
public void setmUrl(String mUrl) {
this.mUrl = mUrl;
}
public String getmFront() {
return mFront;
}
public void setmFront(String mFront) {
this.mFront = mFront;
}
public String getmBack() {
return mBack;
}
public void setmBack(String mBack) {
this.mBack = mBack;
}
}
XML调用
<com.xxx.xxxx.ui.view.AlphaText
android:id="@+id/text_scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>
activity 中设置:
for (int i = 0; i < 5; i++) {
mTextList.add(new TextBean("[头条]", "新闻" + i, ""));
}
alphaText.setmTexts(mTextList);
alphaText.setFrontColor(getResources().getColor(R.color.orange_step));
alphaText.setBackColor(getResources().getColor(R.color.gray_text));
alphaText.setmDuration(7000);
alphaText.setmInterval(3000);
alphaText.setOnClickLitener(new AlphaText.onClickLitener() {
@Override
public void onClick(String index) {
ToastUtil.show(getActivity(), "点击新闻" + index);
}
});