垂直文字 带类别的滚动(垂直文字轮播)
来源:互联网 发布:滴滴java面试难吗 编辑:程序博客网 时间:2024/06/05 03:58
自定义个文字的垂直方向轮滚的组件。
组件代码:
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); } });
0 0
- 垂直文字 带类别的滚动(垂直文字轮播)
- 文字垂直滚动
- 文字垂直滚动
- 文字垂直滚动
- 好用的文字垂直轮播控件
- javascript 水平文字垂直滚动
- Android实现文字垂直滚动
- Android仿京东首页轮播文字(又名垂直跑马灯)
- [前端] 文字垂直滚动+鼠标悬停效果
- 使用VerticalRollingTextView实现单行文字垂直滚动
- Unity ScrollRect 实现垂直滚动文字
- jq文字垂直滚动/滚屏效果
- 带图标和箭头、文字的垂直居中
- 关于文字的垂直居中
- Android TextView 带背景的文字垂直方向显示(ems属性)
- TextView实现文字水平手动滚动和垂直手动滚动
- 文字垂直居中效果
- 如何画垂直文字
- java后台解析XML文件
- 京东自动评论脚本
- 单例的编写
- JVM 内存模型
- VS2015输入中文显示?
- 垂直文字 带类别的滚动(垂直文字轮播)
- 清除缓存
- 移动距离
- px与em的区别
- php完整图片上传代码(上传到本地)
- Android Studio导入项目卡在Building gradle 的解决方法
- 生产者和消费者问题
- 深入理解JavaScript中的作用域和上下文
- vim练习