Android 原生的跑马灯 MarqueeTextView

Android 原生的跑马灯 MarqueeTextView,第1张

概述Android原生的跑马灯MarqueeTextView前段时间需求中有一个横向滚动公告(多条)功能,TextView采用自带的跑马灯效果时无法完全满足我的标准,因此在网上查找其它解决方案,找了不同方法实现的案例,但整体效果都不太理想,要么存在缺陷,最终找到xiaweizi/MarqueeTextView这个方案,感谢作 AndroID 原生的跑马灯 MarqueeTextVIEw
@H_404_7@前段时间需求中有一个横向滚动公告(多条)功能,TextVIEw采用自带的跑马灯效果时无法完全满足我的标准,因此在网上查找其它解决方案,找了不同方法实现的案例,但整体效果都不太理想,要么存在缺陷,最终找到xiaweizi/MarqueeTextView这个方案,感谢作者gitHub的开源项目。

@H_404_7@优化后的具体代码已分享到GitHub liyazhou0221/LeaningProject需要下载的请前往下载

一、方案优点
@H_404_7@1、原理:本方案在AndroID中的TextVIEw自带跑马灯效果的基础上,通过Scroller控制器来控制整个VIEw的滚动。
2、功能:控制滚动时间(速度)、控制滚动延迟、控制滚动模式、生命周期可以自己控制(暂停-继续-重新开始-停止)

二、新增优化内容(在原有的基础上新增部分内容)@H_404_7@1、支持多条数据
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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1039865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存