热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现垂直跑马灯效果

这篇文章主要为大家详细介绍了Android实现垂直跑马灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在我们开发过程中,跑马灯这个功能非常实用的,在实现这个功能的时候,这个时候我们通常需要找demo来实现这个方法,我从github上面找到这个demo感觉很好用,所以就要实现了这个功能喽MarqueeView,看这个工具类,因为我找这个类的时候是没有点击事件的,所以我给它加了一个点击事件,看这个工具类

public class MarqueeView extends ViewFlipper {

 private Context mContext;
 private List notices;
 private boolean isSetAnimDuration = false;
 private int contentSize;
 private int interval = 1000;
 private int animDuration = 500;
 private int textSize = 14;
 private int textColor = 0xffffffff;
 private int gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
 //点击事件
 private OnItemClickListener onItemClickListener;

 public MarqueeView(Context context, AttributeSet attrs) {
 super(context, attrs);
 init(context, attrs, 0);
 }

 private void init(Context context, AttributeSet attrs, int defStyleAttr) {
 this.mCOntext= context;
 if (notices == null) {
 notices = new ArrayList<>();
 }

 TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MarqueeViewStyle, defStyleAttr, 0);
 interval = typedArray.getInteger(R.styleable.MarqueeViewStyle_mvInterval, interval);
 isSetAnimDuration = typedArray.hasValue(R.styleable.MarqueeViewStyle_mvAnimDuration);
 animDuration = typedArray.getInteger(R.styleable.MarqueeViewStyle_mvAnimDuration, animDuration);
 if (typedArray.hasValue(R.styleable.MarqueeViewStyle_mvTextSize)) {
 textSize = (int) typedArray.getDimension(R.styleable.MarqueeViewStyle_mvTextSize, textSize);
 textSize = DisplayUtil.px2sp(mContext, textSize);
 }
 textColor = typedArray.getColor(R.styleable.MarqueeViewStyle_mvTextColor, textColor);
 typedArray.recycle();

 setFlipInterval(interval);

 Animation animIn = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_in);
 if (isSetAnimDuration) animIn.setDuration(animDuration);
 setInAnimation(animIn);

 Animation animOut = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_out);
 if (isSetAnimDuration) animOut.setDuration(animDuration);
 setOutAnimation(animOut);
 }

 // 根据公告字符串启动轮播
 public void startWithText(final String notice) {
 if (TextUtils.isEmpty(notice)) return;
 getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
 @Override
 public void onGlobalLayout() {
 getViewTreeObserver().removeGlobalOnLayoutListener(this);
 startWithFixedWidth(notice, getWidth());
 }
 });
 }

 // 根据公告字符串列表启动轮播
 public void startWithList(List notices) {
 setNotices(notices);
 start();
 }

 // 根据宽度和公告字符串启动轮播
 private void startWithFixedWidth(String notice, int width) {
 int noticeLength = notice.length();
 int dpW = DisplayUtil.px2dip(mContext, width);
 int limit = dpW / textSize;
 if (dpW == 0) {
 throw new RuntimeException("Please set MarqueeView width !");
 }

 if (noticeLength <= limit) {
 notices.add(notice);
 } else {
 int size = noticeLength / limit + (noticeLength % limit != 0 &#63; 1 : 0);
 for (int i = 0; i = noticeLength &#63; noticeLength : (i + 1) * limit);
 notices.add(notice.substring(startIndex, endIndex));
 }
 }
 start();
 }

 // 启动轮播
 public boolean start() {
 if (notices == null || notices.size() == 0) return false;
 removeAllViews();

 for (int i = 0; i  1) {
 startFlipping();
 }
 return true;
 }

 // 创建ViewFlipper下的TextView
 private TextView createTextView(String text, int position) {
 TextView tv = new TextView(mContext);
 tv.setGravity(gravity);
 tv.setText(text);
 tv.setTextColor(textColor);
 tv.setTextSize(textSize);
 tv.setTag(position);
 return tv;
 }

 public List getNotices() {
 return notices;
 }

 public void setNotices(List notices) {
 this.notices = notices;
 }

 public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
 this.OnItemClickListener= onItemClickListener;
 }

 public interface OnItemClickListener {
 void onItemClick(int position, TextView textView);
 }

}

这就是它实现的方式,我从中加了点击事件,所以它的用法是这样的

verticalSwitchTextView1 = (MarqueeView) rootView.findViewById(R.id.vertical_switch_textview1);
List info = new ArrayList<>();
info.add("1.能够适应多行长文本的Android TextView的例子");
info.add("2.\"科比,!");
info.add("3. GitHub帐号:zhangyuanchong");
info.add("4.\"理解的也很简单,");
info.add("5. 破解密钥");
info.add("6. 实现了两种方式");
verticalSwitchTextView1.startWithList(info);
verticalSwitchTextView1.setOnItemClickListener(new MarqueeView.OnItemClickListener() {
 @Override
 public void onItemClick(int position, TextView textView) {
 position = position + 1;
 Toast.makeText(getActivity(), "点击了" + position, Toast.LENGTH_SHORT).show();
 }
});

这样就直接实现喽,其实还是蛮简单的呢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 本文详细介绍了Linux系统中用于管理IPC(Inter-Process Communication)资源的两个重要命令:ipcs和ipcrm。通过这些命令,用户可以查看和删除系统中的消息队列、共享内存和信号量。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • A*算法在AI路径规划中的应用
    路径规划算法用于在地图上找到从起点到终点的最佳路径,特别是在存在障碍物的情况下。A*算法是一种高效且广泛使用的路径规划算法,适用于静态和动态环境。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 解决SQL Server数据库sa登录名无法连接的问题
    在安装SQL Server数据库后,使用Windows身份验证成功,但使用SQL Server身份验证时遇到问题。本文将介绍如何通过设置sa登录名的密码、启用登录名状态以及开启TCP协议来解决这一问题。 ... [详细]
  • MySQL 数据库连接方法
    本文介绍了如何使用 MySQL 命令行工具连接到指定的数据库。 ... [详细]
  • 在 Mac 上配置 NDK
    本文详细介绍了如何在 Mac 上配置 Android NDK,包括设置环境变量和解决常见问题的方法。 ... [详细]
  • 如何解决8080端口被占用问题
    本文介绍了如何通过命令行和任务管理器查找并终止占用8080端口的进程,以确保该端口能够正常使用。 ... [详细]
  • Excel 数据分析基础
    Excel 是数据分析中最基本且强大的工具之一,具备多种实用功能和操作方法。本文将简要介绍 Excel 的不同版本及其兼容性问题,并探讨在处理大数据时的替代方案。 ... [详细]
  • 专业人士如何做自媒体 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
author-avatar
清春无悔396
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有