首先values文件夹下添加或创建attrs文件,如下:

1、自定义上下滚动字幕textview、VerticalRollingTextView

/**

* 作者:created by meixi

* 邮箱:13164716840@163.com

* 日期:2018/8/30 10

*/

public class VerticalRollingTextView extends View {

DataSetAdapter mDataSetAdapter;

private final Paint mPaint;

private int mCurrentIndex;

private int mNextIndex;

Rect bounds = new Rect();

private float mCurrentOffsetY;

private float mOrgOffsetY = -1;

private final float mTextTopToAscentOffset;

private float mOffset;

private InternalAnimation mAnimation = new InternalAnimation();

/*防止动画结束的回调触发以后动画继续进行出现的错乱问题*/

private boolean mAnimationEnded;

private boolean isRunning;

/*动画时间*/

private int mDuration = 1000;

/*动画间隔*/

private int mAnimInterval = 5000;

public VerticalRollingTextView(Context context, AttributeSet attrs) {

super(context, attrs);

mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mPaint.setColor(Color.BLACK);

mPaint.setTypeface(Typeface.DEFAULT);

parseAttrs(context, attrs);

Paint.FontMetricsInt metricsInt = mPaint.getFontMetricsInt();

mTextTopToAscentOffset = metricsInt.ascent - metricsInt.top;

mAnimation.setDuration(mDuration);

}

private void parseAttrs(Context context, AttributeSet attrs) {

float density = getResources().getDisplayMetrics().density;

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.VerticalRollingTextView);

mPaint.setColor(typedArray.getColor(R.styleable.VerticalRollingTextView_android_textColor, Color.BLACK));

mPaint.setTextSize(typedArray.getDimensionPixelOffset(R.styleable.VerticalRollingTextView_android_textSize, (int) (density * 14)));

mDuration = typedArray.getInt(R.styleable.VerticalRollingTextView_android_duration, mDuration);

mAnimInterval = typedArray.getInt(R.styleable.VerticalRollingTextView_animInterval, mAnimInterval);

typedArray.recycle();

}

@Override

protected void onDraw(Canvas canvas) {

// 绘制文本

if (mDataSetAdapter == null || mDataSetAdapter.isEmpty()) {

return;

}

String text1 = mDataSetAdapter.getText(mCurrentIndex);

String text2 = mDataSetAdapter.getText(mNextIndex);

//只需要进行一次测量

if (mOrgOffsetY == -1) {

mPaint.getTextBounds(text1, 0, text1.length(), bounds);

mOffset = (getHeight() + bounds.height()) * 0.5f;

mOrgOffsetY = mCurrentOffsetY = mOffset - mTextTopToAscentOffset;

mAnimation.updateValue(mOrgOffsetY, -2 * mTextTopToAscentOffset);

}

canvas.drawText(text1, 0, mCurrentOffsetY, mPaint);

canvas.drawText(text2, 0, mCurrentOffsetY + mOffset + mTextTopToAscentOffset, mPaint);

}

public void setDataSetAdapter(DataSetAdapter dataSetAdapter) {

mDataSetAdapter = dataSetAdapter;

confirmNextIndex();

invalidate();

}

/**

* 开始转动,界面可见的时候调用

*/

public void run() {

if (isRunning) {

return;

}

isRunning = true;

mAnimation.updateValue(mCurrentOffsetY, -2 * mTextTopToAscentOffset);

post(mRollingTask);

}

/**

* @return true代表正在转动

*/

public boolean isRunning() {

return isRunning;

}

/**

* 停止转动,界面不可见的时候调用

*/

public void stop() {

isRunning = false;

removeCallbacks(mRollingTask);

}

Runnable mRollingTask = new Runnable() {

@Override

public void run() {

mAnimationEnded = false;

startAnimation(mAnimation);

postDelayed(this, mAnimInterval);

}

};

public void animationEnd() {

//1.角标+1

mCurrentIndex++;

//2.计算出正确的角标

mCurrentIndex = mCurrentIndex < mDataSetAdapter.getItemCount() ? mCurrentIndex : mCurrentIndex % mDataSetAdapter.getItemCount();

//3.计算下一个待显示文字角标

confirmNextIndex();

//3.位置复位

mCurrentOffsetY = mOrgOffsetY;

mAnimationEnded = true;

}

@Override

protected void onDetachedFromWindow() {

super.onDetachedFromWindow();

removeCallbacks(mRollingTask);

if (isRunning()) {

mAnimation.cancel();

}

}

/**

* 计算第二个角标

*/

private void confirmNextIndex() {

//3.计算第二个角标

mNextIndex = mCurrentIndex + 1;

//4.计算出正确的第二个角标

mNextIndex = mNextIndex < mDataSetAdapter.getItemCount() ? mNextIndex : 0;

}

/**

* float估值器

*

* @param fraction

* @param startValue

* @param endValue

* @return

*/

float evaluate(float fraction, float startValue, float endValue) {

return startValue + fraction * (endValue - startValue);

}

@Override

public void setOnClickListener(OnClickListener l) {

}

public void setOnItemClickListener(final OnItemClickListener onItemClickListener) {

super.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

onItemClickListener.onItemClick(VerticalRollingTextView.this, mCurrentIndex);

}

});

}

public interface OnItemClickListener {

void onItemClick(VerticalRollingTextView view, int index);

}

class InternalAnimation extends Animation {

float startValue;

float endValue;

@Override

protected void applyTransformation(float interpolatedTime, Transformation t) {

if (mAnimationEnded) return;

mCurrentOffsetY = evaluate(interpolatedTime, startValue, endValue);

if (mCurrentOffsetY == endValue) {

try {

animationEnd();

}catch (Exception e) {

e.printStackTrace();

}

}

postInvalidate();

}

public void updateValue(float startValue, float endValue) {

this.startValue = startValue;

this.endValue = endValue;

}

}

}

2、layout.xml文件

3、activity调用自定义textview赋值

VerticalRollingTextView verticalRollingTextView = (VerticalRollingTextView)findViewById(R.id.myvtext);

TestEntity testEntity = new TestEntity();

testEntity.setHttps("baidu.com");

testEntity.setTitle("百度。com");

TestEntity testEntity1 = new TestEntity();

testEntity1.setTitle("谷歌。com");

testEntity1.setHttps("guge.com");

testEntities.add(testEntity);

testEntities.add(testEntity1);

verticalRollingTextView.setDataSetAdapter(new DataSetAdapter(testEntities) {

@Override

protected String text(TestEntity s) {

return s.getTitle();

}

});

verticalRollingTextView.run();

verticalRollingTextView.setOnItemClickListener(new VerticalRollingTextView.OnItemClickListener() {

@Override

public void onItemClick(VerticalRollingTextView view, int index) {//点击链接

String url = testEntities.get(index).getHttps();

Toast.makeText(MainActivity.this,url,Toast.LENGTH_LONG).show();

}

});

android垂直滚动显示,Android 上下滚动字幕实现相关推荐

  1. android文字多行滚动显示,Android TextView多行文本滚动实现

    Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局.只要在l ...

  2. android notification 定时显示,Android编程使用Service实现Notification定时发送功能示例...

    本文实例讲述了android编程使用service实现notification定时发送功能.分享给大家供大家参考,具体如下: /** * 通过启动或停止服务来管理通知功能 * * @descripti ...

  3. android listview分页显示,Android应用中使用ListView来分页显示刷新的内容

    点击按钮刷新1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: ...

  4. android编辑框显示,android – 如何在屏幕上显示文本编辑框?

    您的问题最简单的解决方案是在您主要(肖像修复的)活动中启动的单独的对话框主题的活动中显示您的EditText. EditText Activity不应该将其方向固定,因此它会沿着您滑出键盘时的期望旋转 ...

  5. android 360状态栏显示,Android高仿UC浏览器和360手机卫士消息常驻栏(通知栏)

    之前网上看了下自定义消息栏,通知栏,了解到了Notification这个控件,发现UC浏览器等都是这种类型,今天写个demo实现下,如图: 其中每个按钮都有不同的功能,代码如下: package co ...

  6. android 垂直水平居中对齐,Android开发借助LinearLayout实现垂直水平居中布局

    释放双眼,带上耳机,听听看~! 在Android应用程序的开发中,有时需要限制水平和垂直屏幕的切换,今天这篇文章是技术狗小编为大家整理的Android应用借助LinearLayout实现垂直水平居中布 ...

  7. android图片解码显示,android 图片解码显示流程

    问题来源 android 可以在 gallery 里面显示内部存储的图片,支持 jpeg,png,gif,bmp 等,甚至文件类型和图片后缀名不一致,只要是图片文件就能显示,然后 git 只会显示第一 ...

  8. android 壁纸完整显示,Android系统完整显示壁纸, 不做X2拉伸处理

    Android系统内置墙纸尺寸跟屏幕尺寸相同, 全尺寸完整显示壁纸, 不做X2拉伸处理: packages\apps\Launcher3\src\com\android\launcher3\util\ ...

  9. android imageview 居中显示,Android中ImageView无法居中的问题

    做Android UI布局,尤其是遇到比较复杂的多重LinearLayout嵌套,常常会被一些比较小的问题困扰上半天,比如今天在使用ImageView的时候,想让其居中显示,可是无论怎样设置layou ...

  10. android垂直公告,【Android之垂直翻页公告】

    该源码是android studio版本,本文最后提供的是eclipse版本,以供大家学习参考. 效果如图: 源码分析: 核心类:MarqueeView.java 核心思想是根据公告内容的数量动态生成 ...

最新文章

  1. xml c libxml类库使用
  2. java.lang.date_无法将java.lang.String类型的值转换为必需类型java.util.Date
  3. OpenCV图像去噪
  4. Python基础学习-Python中最常见括号()、[]、{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho
  5. oracle 数据库运维技术,Oracle数据库智能运维标准化工艺研究-orastar-DIY数据库运维工具-第1期 导论篇...
  6. CSS--使用伪选择器制作箭头图标
  7. 【CSS3】填色表格演示hsl()
  8. JS 在 HTML 中做加减乘除
  9. net core获取客户端ip
  10. VScode 配置 Java 环境
  11. java web 实战开发经典_java web 开发实战经典(一)
  12. c#迁移文件的时候提示:对路径xxx的访问被拒绝
  13. dell服务器装不了无线网卡,DELL E6420无线网卡装不上去
  14. flash, sparkle, glow, gleam, twinkle, glitter
  15. js利用分隔符分隔字符串
  16. 模式识别算法之2--感知器(感知机)算法
  17. c语言(1%3c%3cn),JavaScript教程 一段鬼畜风格的JavaScript解密
  18. excel VBA 字典与集合(Dictionary与Collection)
  19. CGAN(条件生成-对抗网络)简述教程
  20. 【深度学习】Pytorch chunk函数

热门文章

  1. spring data jdbc 基本使用
  2. 【设计模式】建造者模式:你创建对象的方式有它丝滑吗?
  3. 华为b6手环能升级鸿蒙吗,华为手环B6,终于等到你!两年磨一剑的升级,亮点多多!...
  4. cocos2dx android 实现应用重启
  5. DataGrip初体验
  6. PHP跨境电商商城系统源码支持多语言功能
  7. 传奇服务器如何查账号密码,传奇服务端版本中如何查找礼包领取兑换密码的方法!...
  8. 学会这几个Excel小技巧,轻松解决成绩分析问题
  9. (2)高通AP10.4开发者指南——WLAN(1.2 WLAN软件架构)
  10. 全自动加药装置自动加药系统的技术说明