博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RecyclerView实现跑马灯效果
阅读量:6606 次
发布时间:2019-06-24

本文共 4176 字,大约阅读时间需要 13 分钟。

  hot3.png

对方想着做一个跑马灯效果,而且要求内部的文字区域可以点击,我第一想到的就是RecyclerView来做,只要把getItemCount的返回值设置成无限大,就能实现循环滚动效果,滚动可以用scrollBy来实现。

先看MarqueeView类,继承与RecyclerView:

public class MarqueeView extends RecyclerView {    Thread thread = null;    AtomicBoolean shouldContinue = new AtomicBoolean(false);    Handler mHandler;        public MarqueeView(Context context) {        super(context);    }    public MarqueeView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MarqueeView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    private void init() {        //主线程的handler,用于执行Marquee的滚动消息        mHandler=new Handler(){            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                switch (msg.what){                    case 1://不论是竖直滚动还是水平滚动,都是偏移5个像素                        MarqueeView.this.scrollBy(5, 5);                        break;                }            }        };        if (thread == null) {            thread = new Thread() {                public void run() {                    while (shouldContinue.get()) {                        try {                            Thread.sleep(200);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                      Message msg=mHandler.obtainMessage();                        msg.what=1;                        msg.sendToTarget();                    }                    //退出循环时清理handler                    mHandler=null;                }            };        }    }    @Override    /**     * 在附到窗口的时候开始滚动     */    protected void onAttachedToWindow() {        super.onAttachedToWindow();        shouldContinue.set(true);        init();        thread.start();    }    @Override    /**     * 在脱离窗口时处理相关内容     */    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();        stopMarquee();    }    /**     * 停止滚动     */    public void stopMarquee() {        shouldContinue.set(false);        thread = null;    }    /** * Adapter类 */public static class InnerAdapter extends Adapter
 {    private List
 mData;    private int size;    private LayoutInflater mLayoutInflater;    public InnerAdapter(List
 data,Context context) {        mData = data;        size=mData.size();        mLayoutInflater=LayoutInflater.from(context);    }    @Override    public MarqueHolder onCreateViewHolder(ViewGroup parent, int viewType) {            View view=mLayoutInflater.inflate(R.layout.marque_item,parent,false);        return new MarqueHolder(view);    }    @Override    public void onBindViewHolder(MarqueHolder holder, int position) {        holder.tv.setText(mData.get(position%size));    }    @Override    public int getItemCount() {        return Integer.MAX_VALUE;    }/**** ViewHolder类**/    static class MarqueHolder extends ViewHolder {        TextView tv;        public MarqueHolder(View view) {            super(view);            tv = (TextView) view.findViewById(R.id.tv);        }    }}    }

使用就很简单了,下面是MainActivity代码:

public class MainActivity extends AppCompatActivity {//初始化数据    private ArrayList
 data = new ArrayList
() {        {            add("第1条");            add("第2条");            add("第3条");            add("第4条");            add("第5条");            add("第6条");            add("第7条");            add("第8条");            add("第9条");            add("第10条");            add("第11条");        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        MarqueeView marqueeView = (MarqueeView) findViewById(R.id.marqueView);        LinearLayoutManager lm=new LinearLayoutManager(this);        lm.setOrientation(LinearLayoutManager.HORIZONTAL);        marqueeView.setLayoutManager(lm);        marqueeView.setAdapter(new MarqueeView.InnerAdapter(data,this));    }}

两个layout文件,首先是Main的:

      

然后是item的:

至此运行效果如下:

193407_cv1p_1267266.gif

转载于:https://my.oschina.net/tnjin/blog/619614

你可能感兴趣的文章
Linux下修改Mysql的用户(root)的密码
查看>>
sed的基本用法
查看>>
一个不错的shell 脚本入门教程
查看>>
JVM、GC相关资料
查看>>
dell r620装cenots7遇到的问题
查看>>
Ansible之playbook的使用
查看>>
ansible模块批量管理
查看>>
redis命令 - GET
查看>>
[Maven问题总结]Jetty9的Maven配置——嵌入式服务器
查看>>
httpd.conf的基本设置
查看>>
读一本跟技术无关的书籍
查看>>
RHEL/Centos7新功能
查看>>
Drupal 7 数据库 操作
查看>>
第一部分 思科九年 一(1)
查看>>
DBA日常工作职责
查看>>
Redis的持久化
查看>>
linux安装NFS服务器学习
查看>>
Planner .NET日历日程控件能给你的应用程序提供多种日历日程功能
查看>>
我的友情链接
查看>>
Linux压力测试
查看>>