您的位置:首页 > 其它

垂直文字 带类别的滚动(垂直文字轮播)

2017-04-07 11:56 295 查看
自定义个文字的垂直方向轮滚的组件。



组件代码:

public class VerticalScrollText  extends TextView {
private int mDuration; //文字从出现到显示消失的时间
private int mInterval; //文字停留在中间的时长切换的间隔
private List<ScrollTextBean> mTexts; //显示文字的数据源
private int mY = 0; //文字的Y坐标
private int mIndex = 0; //当前的数据下标
private Paint mPaintBack; //绘制内容的画笔
private Paint mPaintFront; //绘制前缀的画笔
private boolean isMove = true; //文字是否移动
private String TAG = "ADTextView";
private boolean hasInit = false;

public interface onClickLitener {
public void onClick(String index);
}

private onClickLitener onClickLitener;

public void setOnClickLitener(VerticalScrollText.onClickLitener onClickLitener) {
this.onClickLitener = onClickLitener;
}

public VerticalScrollText(Context context) {
this(context, null);
}

public VerticalScrollText(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) {
// Log.i(TAG, "onDraw:Y " + mY);
ScrollTextBean 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 (mY == 0 && hasInit == false) {
mY = getMeasuredHeight() - indexBound.top;    //rect原点 向上是负数,向下是正数
hasInit = true;
}
//移动到最上面
if (mY == 0 - indexBound.bottom) {
//    Log.i(TAG, "onDraw:H " + getMeasuredHeight());
mY = getMeasuredHeight() - indexBound.top;
mIndex++;
}
canvas.drawText(back, 0, back.length(), (indexBound.right - indexBound.left) + 20, mY, mPaintBack);
canvas.drawText(font, 0, font.length(), 10, mY, mPaintFront);     //第四象限向下加,向右加
//移动到中间
if (mY == getMeasuredHeight() / 2 - (indexBound.top + indexBound.bottom) / 2) {
isMove = false;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
postInvalidate();
isMove = true;
}
}, mInterval);
}
mY -= 1;
//循环使用数据
if (mIndex == mTexts.size()) {
mIndex = 0;
}
//如果是处于移动状态时的,则延迟绘制
//计算公式为一个比例,一个时间间隔移动组件高度,则多少毫秒来移动1像素
if (isMove) {
postInvalidateDelayed(mDuration / getMeasuredHeight());
}
}

}
}


bean 代码

public class ScrollTextBean {
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.view.VerticalScrollText
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 ScrollTextBean("[头条]", "新闻" + i, ""));
}
scrollText.setmTexts(mTextList);
scrollText.setFrontColor(getResources().getColor(R.color.orange_step));
scrollText.setBackColor(getResources().getColor(R.color.gray_text));
scrollText.setmDuration(500);
scrollText.setmInterval(300);
scrollText.setOnClickLitener(new VerticalScrollText.onClickLitener() {
@Override
public void onClick(String index) {
ToastUtil.show(getActivity(), "点击新闻" + index);
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息