@H_404_7@前段时间需求中有一个横向滚动公告(多条)功能,TextVIEw采用自带的跑马灯效果时无法完全满足我的标准,因此在网上查找其它解决方案,找了不同方法实现的案例,但整体效果都不太理想,要么存在缺陷,最终找到xiaweizi/MarqueeTextView这个方案,感谢作者gitHub的开源项目。
@H_404_7@优化后的具体代码已分享到GitHub liyazhou0221/LeaningProject需要下载的请前往下载一、方案优点
@H_404_7@1、原理:本方案在AndroID中的TextVIEw自带跑马灯效果的基础上,通过Scroller控制器来控制整个VIEw的滚动。二、新增优化内容(在原有的基础上新增部分内容)@H_404_7@1、支持多条数据
2、功能:控制滚动时间(速度)、控制滚动延迟、控制滚动模式、生命周期可以自己控制(暂停-继续-重新开始-停止)
2、为每条数据添加点击事件监听
3、添加自定义滚动速度控制三、具体使用方法@H_404_7@Java代码:
noticeTextV.setonItemClickListener(new MarqueeTextVIEw.OnMarqueeItemClickListener() { @OverrIDe public voID onClick(int position) { // 根据点击位置获取具体是那个公告 JsONObject JsonObject = noticeArray.getJsONObject(position); // ... } @OverrIDe public String[] initshowtextList() { // 根据需要显示的内容,生成显示数组对象 String[] strings = new String[noticeArray.size()]; for (int i = 0; i < noticeArray.size(); i++) { strings[i] = noticeArray.getJsONObject(i).getString("key"); } return strings; } }); noticeTextV.startScroll();
@H_404_7@2、xml配置<!--横向滚动公告--><declare-styleable name="MarqueeTextVIEw"> <!--滚动时长毫秒--> <attr name="scroll_interval" format="integer" /> <attr name="scroll_speed" format="integer" /> <attr name="scroll_first_delay" format="integer" /> <attr name="scroll_mode"> <enum name="mode_forever" value="100" /> <enum name="mode_once" value="101" /> </attr></declare-styleable><MarqueeTextVIEw androID:ID="@+ID/notice_text" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_centerVertical="true" androID:orIEntation="horizontal" androID:textcolor="@color/md_orange_EC8423" androID:textSize="?text_size_normal" app:scroll_first_delay="0" app:scroll_mode="mode_forever" app:scroll_speed="100" />
四、具体实现@H_404_7@1、支持多条数据 /** * 添加显示的公告列表,并 * @param List */ public voID setData(String[] List) { this.ListData = List; showtextData = getshowtextData(); setText(showtextData); } /** * 拼接显示字符串,并计算出每个item所在的位置 * @return */ private String getshowtextData() { if (ListData != null && ListData.length > 0) { ListDataPos = new int[ListData.length]; StringBuilder showData = new StringBuilder(); for (int i = 0; i < ListData.length; i++) { showData.append(ListData[i]); // 每一条后都添加空格占位符 showData.append("\t\t\t\t"); ListDataPos[i] = calculateScrollingLen(showData.toString()); } return showData.toString(); } else { return getText().toString(); } } /** * 计算滚动的距离 * @return 滚动的距离 */ private int calculateScrollingLen(String strTxt) { if (TextUtils.isEmpty(strTxt)) { return 0; } TextPaint tp = getPaint(); Rect rect = new Rect(); tp.getTextBounds(strTxt, 0, strTxt.length(), rect); return rect.wIDth(); }
@H_404_7@2、为每条数据添加点击事件监听 // 手势监听 @OverrIDe public boolean ontouchEvent(MotionEvent event) { // 将触摸事件交给手势处理 mGestureDetector.ontouchEvent(event); return true;//继续执行后面的代码 } private GestureDetector.OnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() { @OverrIDe public boolean onSingleTapConfirmed(MotionEvent e) { // 点击事件 获取点击的位置 if (onItemClickListener != null) { float clickX = mScroller.getCurrX() + e.getX(); for (int i = 0; i < ListDataPos.length; i++) { if (clickX >= 0 && clickX <= ListDataPos[i]) { onItemClickListener.onClick(i); break; } } } return super.onSingleTapConfirmed(e); } };
@H_404_7@3、添加自定义接口 /** * 提供一个对外的初始化显示数据集合的方法 * * @return 显示点数组 */ public interface OnMarqueeItemClickListener { voID onClick(int position); String[] initshowtextList(); }
总结 以上是内存溢出为你收集整理的Android 原生的跑马灯 MarqueeTextView全部内容,希望文章能够帮你解决Android 原生的跑马灯 MarqueeTextView所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)