android垂直滚动显示,Android 上下滚动字幕实现
首先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 上下滚动字幕实现相关推荐
- android文字多行滚动显示,Android TextView多行文本滚动实现
Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局.只要在l ...
- android notification 定时显示,Android编程使用Service实现Notification定时发送功能示例...
本文实例讲述了android编程使用service实现notification定时发送功能.分享给大家供大家参考,具体如下: /** * 通过启动或停止服务来管理通知功能 * * @descripti ...
- android listview分页显示,Android应用中使用ListView来分页显示刷新的内容
点击按钮刷新1.效果如下: 实例如下: 上图的添加数据按钮可以换成一个进度条 因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: ...
- android编辑框显示,android – 如何在屏幕上显示文本编辑框?
您的问题最简单的解决方案是在您主要(肖像修复的)活动中启动的单独的对话框主题的活动中显示您的EditText. EditText Activity不应该将其方向固定,因此它会沿着您滑出键盘时的期望旋转 ...
- android 360状态栏显示,Android高仿UC浏览器和360手机卫士消息常驻栏(通知栏)
之前网上看了下自定义消息栏,通知栏,了解到了Notification这个控件,发现UC浏览器等都是这种类型,今天写个demo实现下,如图: 其中每个按钮都有不同的功能,代码如下: package co ...
- android 垂直水平居中对齐,Android开发借助LinearLayout实现垂直水平居中布局
释放双眼,带上耳机,听听看~! 在Android应用程序的开发中,有时需要限制水平和垂直屏幕的切换,今天这篇文章是技术狗小编为大家整理的Android应用借助LinearLayout实现垂直水平居中布 ...
- android图片解码显示,android 图片解码显示流程
问题来源 android 可以在 gallery 里面显示内部存储的图片,支持 jpeg,png,gif,bmp 等,甚至文件类型和图片后缀名不一致,只要是图片文件就能显示,然后 git 只会显示第一 ...
- android 壁纸完整显示,Android系统完整显示壁纸, 不做X2拉伸处理
Android系统内置墙纸尺寸跟屏幕尺寸相同, 全尺寸完整显示壁纸, 不做X2拉伸处理: packages\apps\Launcher3\src\com\android\launcher3\util\ ...
- android imageview 居中显示,Android中ImageView无法居中的问题
做Android UI布局,尤其是遇到比较复杂的多重LinearLayout嵌套,常常会被一些比较小的问题困扰上半天,比如今天在使用ImageView的时候,想让其居中显示,可是无论怎样设置layou ...
- android垂直公告,【Android之垂直翻页公告】
该源码是android studio版本,本文最后提供的是eclipse版本,以供大家学习参考. 效果如图: 源码分析: 核心类:MarqueeView.java 核心思想是根据公告内容的数量动态生成 ...
最新文章
- xml c libxml类库使用
- java.lang.date_无法将java.lang.String类型的值转换为必需类型java.util.Date
- OpenCV图像去噪
- Python基础学习-Python中最常见括号()、[]、{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho
- oracle 数据库运维技术,Oracle数据库智能运维标准化工艺研究-orastar-DIY数据库运维工具-第1期 导论篇...
- CSS--使用伪选择器制作箭头图标
- 【CSS3】填色表格演示hsl()
- JS 在 HTML 中做加减乘除
- net core获取客户端ip
- VScode 配置 Java 环境
- java web 实战开发经典_java web 开发实战经典(一)
- c#迁移文件的时候提示:对路径xxx的访问被拒绝
- dell服务器装不了无线网卡,DELL E6420无线网卡装不上去
- flash, sparkle, glow, gleam, twinkle, glitter
- js利用分隔符分隔字符串
- 模式识别算法之2--感知器(感知机)算法
- c语言(1%3c%3cn),JavaScript教程 一段鬼畜风格的JavaScript解密
- excel VBA 字典与集合(Dictionary与Collection)
- CGAN(条件生成-对抗网络)简述教程
- 【深度学习】Pytorch chunk函数
热门文章
- spring data jdbc 基本使用
- 【设计模式】建造者模式:你创建对象的方式有它丝滑吗?
- 华为b6手环能升级鸿蒙吗,华为手环B6,终于等到你!两年磨一剑的升级,亮点多多!...
- cocos2dx android 实现应用重启
- DataGrip初体验
- PHP跨境电商商城系统源码支持多语言功能
- 传奇服务器如何查账号密码,传奇服务端版本中如何查找礼包领取兑换密码的方法!...
- 学会这几个Excel小技巧,轻松解决成绩分析问题
- (2)高通AP10.4开发者指南——WLAN(1.2 WLAN软件架构)
- 全自动加药装置自动加药系统的技术说明