实现TextView垂直滚动以及监听

2023-11-16

由于新的项目中在广告轮播用到了垂直滚动显示,所以也当学习,自己定义了一个垂直滚动的view以及监听

用到TextSwitcher和ViewFactory

TextSwitcher :字面理解是文字交换器,是ViewSwitcher的子类,从ViewSwitcher来看,是View交换器,TextSwitcher继承自ViewSwitcher,显然是交换TextView。

ViewFactory:顾名思义,view的工厂类,在实现方法makeView()方法中实现TextView的初始化

好了前期工作做好了上代码:

package xql.recycleviewdemo.view;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Color;
import android.graphics.Matrix;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextSwitcher;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewSwitcher.ViewFactory;
import xql.recycleviewdemo.R;
import xql.recycleviewdemo.R.anim;
public class VerticalTextView extends TextSwitcher implements ViewFactory {
private ArrayList<String> mList;
private int mIndex = -1;
private final int START_TEXTVIEW = 1;
private final int STOP_TEXTIEW = 2;
private Context mContext;
// mInUp,mOutUp分别构成向下翻页的进出动画
private Rotate3dAnimation mInUp;
private Rotate3dAnimation mOutUp;

public VerticalTextView(Context context) {
super(context);
mContext = context;
init();


}
public VerticalTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();


}
private void init() {
this.setFactory(this);
this.setInAnimation(getContext(), R.anim.vertical_in);
this.setOutAnimation(getContext(), R.anim.vertical_out);
// mInUp = createAnim(true, true);
// mOutUp = createAnim(false, true);
//
// setInAnimation(mInUp);// 当View显示时动画资源ID
// setOutAnimation(mOutUp);// 当View隐藏是动画资源ID。
}


private Rotate3dAnimation createAnim(boolean turnIn, boolean turnUp) {
Rotate3dAnimation rotation = new Rotate3dAnimation(turnIn, turnUp);
rotation.setDuration(1200);// 执行动画的时间
rotation.setFillAfter(false);// 是否保持动画完毕之后的状态
rotation.setInterpolator(new AccelerateInterpolator());// 设置加速模式
return rotation;
}


public void setResources(ArrayList<String> list) {
mList = list;
}
public Handler handler;
public void start() {
if (mList != null && mList.size() > 0) {
if (handler == null) {
initHandler();
}
handler.sendMessageDelayed(Message.obtain(handler, 1), 3000);
} else {
Toast.makeText(mContext, "请设置数据", 1).show();
}
}


public void stop() {
if (handler != null) {
handler.removeCallbacksAndMessages(null);// 删除Handler中的所有消息
handler = null;
}


}


public int getPosition() {
return mIndex;
}


public boolean onTouchEvent(android.view.MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println("按下");
handler.removeCallbacksAndMessages(null);// 删除Handler中的所有消息
break;
case MotionEvent.ACTION_CANCEL:
System.out.println("事件取消");
handler.sendMessageDelayed(Message.obtain(handler, 1), 3000);
break;
case MotionEvent.ACTION_UP:
System.out.println("抬起");
handler.sendMessageDelayed(Message.obtain(handler, 1), 3000);
break;
default:
break;
}


return true;


};


@Override
public View makeView() {
TextView tv = new TextView(mContext);
tv.setTextColor(0x24aaff);
tv.setGravity(Gravity.CENTER);
tv.setTextSize(20);
tv.setSingleLine(true);
tv.setGravity(Gravity.CENTER_VERTICAL);
tv.setEllipsize(TruncateAt.END);
tv.setTextColor(Color.RED);
tv.setTextSize(20);
tv.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
if (listenre != null) {
listenre.onClick(mIndex);
}


}
});
return tv;
}


private void initHandler() {
if (handler == null) {
handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case START_TEXTVIEW:
updateTextSwitcher();
handler.sendMessageDelayed(Message.obtain(handler, 1), 3000);
break;
case STOP_TEXTIEW:
handler.removeCallbacksAndMessages(null);
break;
}


}


};
}
}


private void updateTextSwitcher() {
if (mList != null && mList.size() > 0) {
if (mIndex > this.mList.size() - 2) {
mIndex = -1;
}
this.setText(mList.get(++mIndex));


}


};


class Rotate3dAnimation extends Animation {
private float mCenterX;
private float mCenterY;
private final boolean mTurnIn;
private final boolean mTurnUp;
private Camera mCamera;


public Rotate3dAnimation(boolean turnIn, boolean turnUp) {
mTurnIn = turnIn;
mTurnUp = turnUp;
}


@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mCamera = new Camera();
mCenterY = getHeight();
mCenterX = getWidth();
}


@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {


final float centerX = mCenterX;
final float centerY = mCenterY;
final Camera camera = mCamera;
final int derection = mTurnUp ? 1 : -1;


final Matrix matrix = t.getMatrix();


camera.save();
if (mTurnIn) {
camera.translate(0.0f, derection * mCenterY * (interpolatedTime - 1.0f), 0.0f);
} else {
camera.translate(0.0f, derection * mCenterY * (interpolatedTime), 0.0f);
}
camera.getMatrix(matrix);
camera.restore();


matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}


private OnClickListner listenre;


public interface OnClickListner {
void onClick(int position);
}


public void setOnClickListener(OnClickListner listener) {
this.listenre = listener;


}
}

至于转换动画则是用了两种,一种补间动画的translate 动画

vertical_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

   <translate
        android:duration="1000"
        android:fromYDelta="-100%p"
        android:toYDelta="0%p" />
</set>

vertical_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromYDelta="0%p"
        android:toYDelta="100%p"
    />


</set>

以及网上当下来的代码,已在代码中实现

实现监听是通过textView的监听回调的,如果用该控件的监听,会失效不知道是不是方法不对还是事件分发处理问题,如果有知道的希望告诉我,谢谢


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现TextView垂直滚动以及监听 的相关文章

  • 适用于 IOS 和 Android 的支付网关 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个应用程序 用户必须在澳大利亚餐馆通过应用程序 android ios 付款 有两种付款方式 通过 PayPal 或 Visa
  • 在我的 Android 应用程序中使用 ServerValue.TIMESTAMP

    我读过很多相关的 stackoverflow 问题 ServerValue TIMESTAMP 但我不知道如何在我的应用程序中使用它 我需要获取帖子创建的时间戳 时间戳应该添加到与帖子的 uid 作者等相同的位置 代码片段其中写这篇文章Fi
  • 如何从该 JAVA 文件中提取 Delphi 类以与 Android 一起使用?

    我的Delphi XE7项目需要与FTDI FT311 Android 配件芯片 http www ftdichip com Products ICs FT311D html 他们帮助提供了一个 Android 演示 其中包括他们的 JAV
  • Gradle 构建错误:内存不足

    当我使用 gradle 构建时 它失败并显示以下信息 OpenJDK 64 Bit Server VM warning INFO os commit memory 0x0000000788800000 89128960 0 failed e
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • android中根据屏幕尺寸计算图像尺寸

    我正在尝试根据屏幕尺寸计算图像高度和宽度 我从后端获取 5 x 7 尺寸的图像 为了将像素乘以 72 进行转换 我有 360 X 504 尺寸的图像 对于 360 X 504 我的动态透明矩形区域将显示为 1 223 x 1 179 即 8
  • onScale 事件后触发奇怪的 onScroll 事件

    我有一个同时使用 SimpleOnScaleGestureListener 和 SimpleOnGestureListener 的应用程序 每当我进行捏缩放时 我都会得到预期的 onScale 但是当我抬起时 我会看到一个奇怪的 onScr
  • Android中如何检测WIFI连接何时建立?

    我需要检测何时通过 WIFI 建立网络连接 发送什么广播来确定已建立有效的网络连接 我需要验证是否存在有效的 HTTP 网络连接 我应该监听什么以及需要进行哪些额外测试才能知道是否存在有效连接 您可以注册一个BroadcastReceive
  • Android 版 jTwitter 授权错误

    我在我的 Android 应用程序中使用 jTwitter 库 直到前天一切都运转良好 但今天遇到异常 服务提供商响应错误 301 请帮助我 这是堆栈跟踪 02 21 21 07 27 258 E AndroidRuntime 4013 F
  • 使用 Android Studio 进行调试永远停留在“等待调试器”状态

    UPDATE The supposed重复是一个关于陷入 等待调试器 执行时Run 而这个问题就陷入了 等待调试器 执行时Debug 产生问题的步骤不同 解决方案也不同 每当我尝试使用Android Studio的调试功能时 运行状态总是停
  • Android 纹理仅显示纯色

    我正在尝试在四边形上显示单个纹理 我有一个可用的 VertexObject 它可以很好地绘制一个正方形 或任何几何对象 现在我尝试扩展它来处理纹理 但纹理不起作用 我只看到一种纯色的四边形 坐标数据位于 arrayList 中 the ve
  • 如何使用应用程序接口将蓝牙套接字传递给另一个活动

    因此 根据我收集的信息 套接字连接既不可序列化 也不可分割 但我需要将蓝牙连接传递给另一个活动 我不想作为中间人编写服务 所以请不要将此作为解决方案发布 我听说有一种方法可以使用自定义应用程序接口来传递这些类型的对象 但我一生都找不到这样的
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • SDK >=26 仍需要 mipmap/ic_launcher.png?

    在 Android 中 有两种指定启动器图标 可以说是应用程序图标 的方法 老 方式 在 mipmap 文件夹中指定不同的 png 文件 通常命名为 ic launcher png 但可以通过以下方式设置名称android icon mip
  • Activity 类型中的方法 showDialog(int) 在 Android 中已被弃用?

    方法showDialog int 从类型Activity is 已弃用 什么原因 以及如何解决 什么原因 http developer android com reference android app Activity html show
  • Android 地理围栏无法正常工作(未调用 IntentService)

    这是我的代码 安卓清单
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • Fragment 生命周期和在不存在的 Fragment 上调用 onCreate 的问题

    我正在 Android 中测试片段 并且片段生命周期有一些令人困惑的行为 我有一个活动 在横向和纵向模式下使用 xml 布局 我有一些代码可以访问在片段布局之一中定义的 EditText 对象 如果我以横向模式启动应用程序 一切都会正常 我
  • R.java是手动修改的!恢复到生成的版本

    我在布局中添加了一个 xml 文件 之后这个错误就来了 但问题是我还没有接触过 R java 文件 现在 在我的新活动中 我要将其内容视图设置为我新创建的 xml 文件 但是当我执行 R layout 时 新创建的 xml 不会出现在建议中
  • 我应该如何在 Android 上使用 Retrofit 处理“无互联网连接”

    我想处理没有互联网连接的情况 通常我会运行 ConnectivityManager cm ConnectivityManager context getSystemService Context CONNECTIVITY SERVICE N

随机推荐

  • Mac快速打开terminal终端快捷键操作

    Command 空格键跳出搜索框 输入ter 按 enter即可打开
  • 调试osgEarth(33)分页瓦片卸载器子节点的作用-(3)渲染遍历的帧号和时间设置-_真正的terrain使用TerrainCuller---水平方向剔除

    如果还记得来自于何方 看看一个月前如何引入TerrainCuller的 如何判断是否该cull呢 在这里先打个断点 用的包围球 可见 通过VIEW FRUSTUM CULLING SMALL FEATURE CULLING SHADOW O
  • webrtc服务器搭建

    两年前写的笔记 可能有些链接和方式已经不对了 自己评估 文章目录 名词解释 概要 房间服务 信令服务 ICE STUN TURN 服务 Web服务的安装与配置 房间服务 安装与配置 安装 信令服务 turn服务 参考 扩展阅读 other
  • 常用的医学图像分割评价指标

    常用的图像分割评价指标非常多 论文中常用的指标包括像素准确率 交并比 IOU Dice系数 豪斯多夫距离 体积相关误差 下面提到的所有案例都是二分类 标签中只有0和1 目录 一 像素准确率 二 交并比IOU 三 骰子系数Dice 四 Hau
  • 【JavaScript高级】原型和继承相关:原型对象、函数原型、原型链和继承、继承的优化、对象判断相关方法

    文章目录 原型对象 对象的原型 函数的原型 函数原型作用 new操作原型的赋值 将方法放在原型上 constructor属性 在原型中新增属性 重写函数原型对象 原型链和继承 原型链 原型链实现方法的继承 借用构造函数属性继承 继承的优化
  • java8 stream 转换list、map、set

    一 Collection Collections collect Collector Collectos Collection是Java集合的祖先接口 Collections是java util包下的一个工具类 内涵各种处理集合的静态方法
  • 基于FPGA的正弦波发生器设计与实现

    基于FPGA的正弦波发生器设计与实现 摘要 本文介绍了一种基于FPGA的正弦波发生器的设计与实现 通过使用FPGA的数字信号处理功能 可以实现高精度 高性能的正弦波生成 文章首先介绍了DDS Direct Digital Synthesis
  • vs2008中,在OCX控件中应用doc/view基本步骤

    1 利用向导创建一个MFC ActiveX Control控件CMyOCX 2 在工程中加入ActivDoc头文件和执行文件 class CActiveXDocTemplate public CSingleDocTemplate enum
  • 阿里-淘菜菜一面(电话面试)面经

    上来我先给面试官打预防针 我说我准备时间不长 可能不太行 意思是想推迟一段时间再面试 他让我别紧张 面试时间定下来不容易 就先直接面试 问题如下 1 在学校还是在家里 课程怎么样了 在学校 学分修完了 目前在学技术 2 自我介绍 人工智能学
  • Android LayoutInflater原理分析,带你一步步深入了解View(一)

    相信接触Android久一点的朋友对于LayoutInflater一定不会陌生 都会知道它主要是用于加载布局的 而刚接触Android的朋友可能对LayoutInflater不怎么熟悉 因为加载布局的任务通常都是在Activity中调用se
  • 数字化转型背景-数字化转型网

    数字化转型网szhzsw cn 数字化转型是指企业或组织将传统业务模式 流程 技术和文化等方面与数字技术相融合 实现数字化升级和转型的过程 数字化转型的背景有以下几个方面 技术发展 随着科技的不断进步 各种数字技术不断涌现 包括人工智能 物
  • Android Switch控件修改样式

    Android中自带的Switch控件在很多时候总觉得和整体系统风格不符 很多时候 自定义Switch是一种方法 但其实不用这么麻烦 安卓自带的Switch通过修改一些属性 也可以达到和自定义Switch差不多的一个效果 个人感觉 Swit
  • 对java中char的取值范围思考

    主要说一下我遇到的一个问题 就是网上关于char字符的取值范围定义 有的说是0 255 有的说是 u0000 uffff 其实 这两种说法都对 我们都知道 java中给char字符的解释是十六位 双字节 也就是按照补码的方式寻求取值范围 就
  • 延时任务-基于redis zset的完整实现

    所谓的延时任务给大家举个例子 你买了一张火车票 必须在30分钟之内付款 否则该订单被自动取消 订单30分钟不付款自动取消 这个任务就是一个延时任务 我之前已经写过2篇关于延时任务的文章 完整实现 通过DelayQueue实现延时任务 延时任
  • Elasticsearch --- 向es中导入数据

    一 从文件导入 用django启动 def zi dr request f open c txt r encoding utf 8 action index c12 type doc source title i strip 去掉 空 fo
  • 关于ES集群规模规划

    在搭建正式的生产集群之前 充分做好硬件和服务器配置以及集群规划是重中之重 磨刀不误砍柴工 硬件配置推荐 内存 ES排序以及聚合都是高度需求内存的 单机 单节点 64GB是很理想的配置 32GB或16GB也很常见 不推荐低于8GB 性价比较低
  • Elastic-Job - 分布式定时任务框架

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Elastic Job是ddframe中dd job的作业模块中分离出来的分布式弹性作业框架 去掉了和dd job中的监控和ddframe接入规范部分 该项目基于成熟的开源
  • STM32移植FATFS时处理 warning: #188-D: enumerated type mixed with another type

    在STM32上移植FATFS时disk read 函数返回类型是DRESULT 而DRESULT是一个枚举类型 所以老是会提醒 warning 188 D enumerated type mixed with another type 主要
  • 前端歌谣的刷题之路-第二十一题-css单位二

    目录 前言 题目 核心代码 总结 前言 我是歌谣 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷 本题目源自于牛客网 微信公众号前端小歌谣 题目 请将html模块div元素的宽度和高度设置为html根元素字体大小的4倍 注意 只需在css
  • 实现TextView垂直滚动以及监听

    由于新的项目中在广告轮播用到了垂直滚动显示 所以也当学习 自己定义了一个垂直滚动的view以及监听 用到TextSwitcher和ViewFactory TextSwitcher 字面理解是文字交换器 是ViewSwitcher的子类 从V