改写控件之《runOnUiThread实现变换的TextView》,与Handle不同的体验

简介:

转载请注明出处王亟亟的大牛之路

业精于勤而荒于嬉,行成于思而毁于随。

今天 上一个用runOnUiThread实现的试图内容切换功能,用Handle也可以实现,但是今天 想用这个例子让大家了解下runOnUiThread。

我们来看下他的实现

public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

需要传入一个Runnable 对象,如果当前线程是用户界面线程,然后立即执行动作。如果当前线程不是用户界面线程,则该动作被张贴到用户界面线程的事件队列中。

而我们的Handle方法则是在handleMessage方法内实现业务逻辑,如果不是需要交互的UI,比较推荐runOnUiThread,因为使用更方便 -。-

OK,贴下代码(今天应用报截屏Gif那个老卡,就不截了,就是一直在那里换字,大家可以跑Demo体验下)

SwitchTextView(继承TextView就可以使用他的标签)

public class SwitchTextView extends TextView {
    private boolean repeatFlag = false;
    private static final long MINUTE = 60000;
    private long delay = 1000; //  默认情况下时间

    public SwitchTextView(Context context) {
        super(context);
    }

    public SwitchTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SwitchTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    // 每秒显示的字,越大刷新字越快
    public SwitchTextView setWordsPerSecond(long wordsPerSecond) {
        this.delay = MINUTE / wordsPerSecond;
        return this;
    }

    public void showText(String text) {
        final String words[] = text.split(" ");
        final Activity activity = (Activity)getContext();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(repeatFlag) {
                    for(final String word : words) {
                        activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                setText(word);
                            }
                        });
                        sleep(delay);
                    }
                }

            }
        }).start();
    }

    public void sleep(long time) {
        try {
            Thread.sleep(time);
        } catch(InterruptedException e) {
            Log.e(this.getClass().getName(), "Cannot set sleep", e);
        }
    }

    /**
     * 是否可以操作
     * @param repeatFlag
     * @return
     */
    public SwitchTextView setRepeat(boolean repeatFlag) {
        this.repeatFlag = repeatFlag;
        return this;
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {
    private SwitchTextView switchTextView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        switchTextView = (SwitchTextView)findViewById(R.id.quick_reader_view);
        switchTextView.setTextColor(Color.parseColor("#EE2E64"));
        String text = "这 是 一 大 大 堆 话, 好 长 的 哦 ! !";
        switchTextView.setWordsPerSecond(100).setRepeat(true).showText(text);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

实现就这些,不理解的话可以看源码:
http://yunpan.cn/cHm8scEWjT7gp 访问密码 4db7

目录
相关文章
|
C++ C语言 JavaScript
72B、1.8B、Audio模型
72B和1.8B是两个不同的模型,具体区别如下: - 72B是一个相对较大的模型,拥有72个亿个参数,而1.8B只有180亿个参数。
719 4
|
机器学习/深度学习 人工智能 监控
YOLO的前世今生以及来龙去脉的背景介绍
YOLO的前世今生以及来龙去脉的背景介绍
|
9月前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
9月前
|
存储 弹性计算 安全
阿里云服务器经济型e实例4核16G和8核32G特惠云服务器测评参考
阿里云有两款特惠云服务器——4核16G10M带宽和4核32G10M带宽,系统盘都是100G ESSD Entry,价格分别仅需70元1个月和160元1个月。那么,这两款云服务器到底性能如何?适用于哪些场景?是否值得购买?本文将全方位深入测评这两款特惠云服务器,并为您提供详细的购买建议。
|
11月前
|
机器学习/深度学习 人工智能 并行计算
量子计算与人工智能:智能革命的新动力
量子计算与人工智能的结合正成为推动社会进步和产业升级的重要力量。量子计算利用量子比特实现高效并行计算,而人工智能则在语音、图像识别等领域取得显著成果。两者结合可加速模型训练、提高计算效率和优化算法,为医疗、智能制造等领域带来深远影响。尽管面临技术成熟度和跨学科人才培养等挑战,但其巨大潜力预示着未来的智能革命。
|
11月前
|
机器学习/深度学习 人工智能 搜索推荐
人工智能在医疗诊断中的应用与挑战
【10月更文挑战第28天】 本文深入探讨了人工智能(AI)在医疗诊断领域的应用现状、面临的挑战以及未来的发展趋势。通过分析AI技术如何提高诊断效率和准确性,同时指出数据隐私、伦理问题和技术局限性等关键挑战,本文旨在为医疗行业和AI研究者提供有价值的参考。
309 0
|
安全 物联网 网络安全
智能家居安全:物联网设备的风险与防护措施
随着物联网技术的飞速发展,智能家居已成为现代生活的一部分。然而,智能设备的便利性背后隐藏着安全隐患。本文将深入探讨物联网设备面临的主要风险,并提供有效的防护措施,帮助用户构建一个更安全的智能家居环境。
425 7
|
数据安全/隐私保护
MIUI中无法获取所有短信的坑
MIUI中无法获取所有短信的坑
277 2
|
语音技术 iOS开发 MacOS
Mac上的全局翻译利器 : Bob + PopClip
Mac上的全局翻译利器 : Bob + PopClip
1080 0
|
数据挖掘 计算机视觉 Python
SciPy图像处理技巧:图像增强与特征提取
【4月更文挑战第17天】本文介绍了如何使用SciPy进行图像增强和特征提取。通过调整亮度、对比度和伽马校正实现图像增强,示例代码展示了相关操作。同时,利用Sobel算子进行边缘检测和Laplacian of Gaussian (LoG) 进行角点检测,以提取图像特征。虽然SciPy不是专业的图像处理库,但其数值计算能力在图像分析中仍有一定价值,可与其他图像处理库结合使用。