Android 上下滚动字幕实现

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

 

<?xml version="1.0" encoding="utf-8"?>
<resources><!--//垂直滚动字幕--><declare-styleable name="VerticalRollingTextView"><!--文字颜色--><attr name="android:textColor"/><!--文字大小--><attr name="android:textSize"/><!--滚动动画时长--><attr name="android:duration"/><!--两次动画之间的间隔--><attr name="animInterval" format="integer"/></declare-styleable></resources>

 

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();}@Overrideprotected 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() {@Overridepublic void run() {mAnimationEnded = false;startAnimation(mAnimation);postDelayed(this, mAnimInterval);}};public void animationEnd() {//1.角标+1mCurrentIndex++;//2.计算出正确的角标mCurrentIndex = mCurrentIndex < mDataSetAdapter.getItemCount() ? mCurrentIndex : mCurrentIndex % mDataSetAdapter.getItemCount();//3.计算下一个待显示文字角标confirmNextIndex();//3.位置复位mCurrentOffsetY = mOrgOffsetY;mAnimationEnded = true;}@Overrideprotected 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);}@Overridepublic void setOnClickListener(OnClickListener l) {}public void setOnItemClickListener(final OnItemClickListener onItemClickListener) {super.setOnClickListener(new OnClickListener() {@Overridepublic 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;@Overrideprotected 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文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.administrator.tests.VerticalRollingTextViewandroid:layout_width="match_parent"android:layout_height="40dp"android:background="@color/numtext"android:textColor="@color/colorAccent"android:id="@+id/myvtext"/></LinearLayout>

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<TestEntity>(testEntities) {@Overrideprotected String text(TestEntity s) {return s.getTitle();}
});
verticalRollingTextView.run();
verticalRollingTextView.setOnItemClickListener(new VerticalRollingTextView.OnItemClickListener() {@Overridepublic void onItemClick(VerticalRollingTextView view, int index) {//点击链接String url = testEntities.get(index).getHttps();Toast.makeText(MainActivity.this,url,Toast.LENGTH_LONG).show();}
});

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mongoose获取最高分

我的需求&#xff1a;获取所有成绩中的最高分。 方法&#xff1a;根据分数倒序&#xff0c;查询第一个。 const topScore await Score.find().sort({ score: -1 }).skip(0).limit(1);

工作163:eachrt修改

<template><div><el-card><el-card><time-selects GetTime"GetTime"></time-selects><!--第一步 页面--><div id"main" :style"{ width: 1000px, height: 300px }"></div><div id&quo…

Android 使用ViewPager实现view轮播效果,单个item分页样式,多个item分页样式,横向listview

效果 单个item样式 多个item样式 横向item 自定义viewpager——可开关切换动画 public class NoAnimationViewPager extends ViewPager {public NoAnimationViewPager(Context context) {super(context);}public NoAnimationViewPager(Context context, AttributeSet attrs) …

高德地图开发 怎么去除城市信息

主要通过设置features&#xff0c;里面不要填写point&#xff0c;代表标注即可。 mapConfig {zoom: 17,cityName: MapCityName,pitch: 25,viewMode: 3D,features: [bg, road, building]}官方参考文档&#xff1a;https://lbs.amap.com/api/javascript-api/example/personaliz…

工作164:对父和混入的理解

1点击按钮看编辑事件 2点击编辑之后 对当前页面的方法进行调用 3找到子组件下面的混入方法 create下面引入混入 4找到子组件混入下面的混入方法 5找到下面的getlist方法

Minimum supported Gradle version is 4.1. Current version is 4.0.

Android studio 项目无法编译&#xff0c;报错如下&#xff1a; Minimum supported Gradle version is 4.1. Current version is 4.0. Please fix the projects Gradle settings. Gradle settings 解决方法&#xff1a; 项目build.gradle下 classpath com.android.tools.…

ubuntu16.04 安装caffe以及python接口

http://blog.csdn.net/qq_25073253/article/details/72571714http://blog.csdn.net/greed7480/article/details/68486039 首先在你要安装的路径下 clone &#xff1a;git clone https://github.com/BVLC/caffe.git 进入 caffe &#xff0c;将 Makefile.config.example 文件复制…

mongodb $ifNull

$ifNull用于判断第一个表达式是否为 NULL&#xff0c;如果为 NULL 则返回第二个参数的值&#xff0c;如果不为 NULL 则返回第一个参数的值。 $ifNull表达式格式为&#xff1a; { $ifNull: [ <expression>, <replacement-expression-if-null> ] }例子&#xff1a;…

Failed to resolve: android.arch.lifecycle:runtime:1.0.0,Failed to resolve: support-v4

Android studio 导入项目报错&#xff1a; Failed to resolve: com.android.support:support-core-ui:26.1.0 Add Google Maven repository and sync project Open File Show in Project Structure dialog Failed to resolve: android.arch.lifecycle:runtime:1.0.0 Open Fil…

工作165:混入调用的时候

直接created里面定义 不需要在其他位置进行过多操作

Hibernate总结

1.为什么要使用Hibernate开发你的项目呢&#xff1f;Hibernate的开发流程是怎么样的&#xff1f; 为什么要使用①.对JDBC访问数据库的代码做了封装&#xff0c;大大简化了数据访问层繁琐的重复性代码。②.Hibernate 是一个基于JDBC的主流持久化框架&#xff0c;是一个优秀的ORM…

mpvue 中控制swiper滑动,禁止滑动,只允许左滑动,不允许右滑

直接禁止滑动&#xff0c;使用&#xff1a;catchtouchmove参数就OK。 例子&#xff1a; <swiper-item v-for"(item,index) in examList" :key"index" catchtouchmove"false">content</swiper-item>但是我的需求是进行人员测评&…

工作166:错误的处理方式

1这种处理没有数据 2 这样处理勉强调用了接口 但是获取数据还是有问题

07异常处理

1、 【请尝试解释以下奇怪的现象&#xff01;】 int i1, j0, k; ki/j; 代码在运行时会引发异常 上边代码在运行时不会引发异常 浮点数除以0&#xff1a;Infinity 可以使用javap去反汇编两个示例程序的.class文件&#xff08;一个是AboutException.class&#xff0c;另一个是Thr…

java、Android 数组转集合

<array name"title"><item>51巅峰钜惠</item><item>十大星级品牌联盟&#xff0c;全场2折起</item><item>生命不是要超越别人&#xff0c;而是要超越自己。</item><item>己所不欲&#xff0c;勿施于人。——孔子<…

mac instantclient_12_2 安装配置

1、创建一个目录进行文件存放 mkdir oraclecd oracle2、instantclient_12_2文件拷贝到oracle目录下 3、拷贝重要文件到~/lib目录 mkdir ~/libln -s instantclient_12_2/libclntsh.dylib ~/lib/cp instantclient_12_2/{libclntsh.dylib.12.1,libnnz12.dylib,libociei.dylib} …

工作166:正确eachrt渲染方式

1第一步 2第二步 3第三步

Effective C++: 06继承与面向对象设计

32&#xff1a;确定你的public继承塑模出is-a关系 以C进行面向对象编程&#xff0c;最重要的一个规则是&#xff1a;public继承表示的是"is-a"&#xff08;是一种&#xff09;的关系。 如果令class D以public形式继承class B&#xff0c;你便是告诉编译器说&#xff…

Android轮播图 banner,图片视频混播banner

1、使用Android循环滚动控件——ViewFlipper实现方法&#xff1a;https://blog.csdn.net/meixi_android/article/details/84615857 2、使用第三方module实现方法&#xff1a; 需要引入的module下载链接&#xff1a;https://pan.baidu.com/s/1sdlQefBTfkLsNO__ouwz8w 添加mod…