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

Android实现通知消息水平播放、无限循环效果

Android实现通知消息水平播放、无限循环效果非常常见,今天小编给大家分享实例代码感兴趣的朋友参考下吧

今天我们来实现一个简单的效果,通知消息无限循环播放,先看效果图:

这里写图片描述

这个效果也很常见,实现的方法也有很多,我是使用RecyclerView来实现的,觉得还是挺不错的,就写下来分享给大家。

下面先看我们的布局文件main.xml,里面主要是一个RecyclerView:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
 

接下来看一下MainActivity的代码:

public class MainActivity extends Activity {
 @BindView(R.id.myRecyclerView)RecyclerView myRecyclerView;
 private List mDatas;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  ButterKnife.bind(this);
  initData();
  initView();
 }
 private void initData(){
  mDatas = new ArrayList<>();
  mDatas.add("我被青春撞了一下腰");
  mDatas.add("爱就一个字,我只说一次");
  mDatas.add("你在他乡还好吗");
 }
 private void initView(){
  LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
  myRecyclerView.setLayoutManager(linearLayoutManager);
  myRecyclerView.setAdapter(new MyAdapter());
  handler.sendEmptyMessageDelayed(0x00,1000);
 }
 private Handler handler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
   myRecyclerView.scrollBy(myRecyclerView.getScrollX()+2,myRecyclerView.getScrollY());
   handler.sendEmptyMessageDelayed(0x00,100);
  }
};
}

再看一下Adapter:

class MyAdapter extends RecyclerView.Adapter{
  @Override
  public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
   return new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recyclerview,parent,false));
  }
  @Override
  public void onBindViewHolder(MyViewHolder holder, final int position) {
   final int tempPos = position%(mDatas.size());
   holder.textView.setText(mDatas.get(tempPos));
   holder.textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     Toast toast = Toast.makeText(MainActivity.this,mDatas.get(tempPos),Toast.LENGTH_SHORT);
     toast.setGravity(Gravity.CENTER,0,0);
     toast.show();
    }
   });
  }
  @Override
  public int getItemCount() {
   return 100000;
  }
 }
 class MyViewHolder extends RecyclerView.ViewHolder{
  private TextView textView;
  public MyViewHolder(View itemView) {
   super(itemView);
   textView = (TextView) itemView.findViewById(R.id.tv_recyclerview);
  }
}

首先,创建一个List,存放播放的数据,然后设置RecyclerView,

我们看一下MyAdapter,在getItemCount()方法里,我们返回的次数是100000,目的就是为了让数据大一点,看似达到了无限播放的效果,毕竟用户在一个界面的停留时间是有限的,这个根据具体业务场景,还可以适当调整。在看一下MainActivity的initView方法,设置好了RecyclerView之后,使用handler发送一个空消息,到达handler的handleMessage方法,这个方法的处理,就是我们的核心了,
myRecyclerView.scrollBy(myRecyclerView.getScrollX()+2,myRecyclerView.getScrollY());

使用scroolBy,每隔100毫秒发送一次消息,每次scrollX增加2个像素位移,即可达到无限循环滚动的效果,好神奇。到此我们的功能就实现了。

下面做两个优化:

1.第一个优化,

当页面有跳转时,禁止消息滚动,即暂停,当页面回来的时候再接着滚动。
我们定义一个boolean类型的变量,在onStop和onRestart方法里分别赋值,

private boolean flag;
 @Override
 protected void onRestart() {
  flag = false;
  handler.sendEmptyMessageDelayed(0x00,100);
  super.onRestart();
 }
 @Override
 protected void onStop() {
  flag = true;
  super.onStop();
 }

接着,handler的handlerMessage方法稍微也改一下:

 @Override
  public void handleMessage(Message msg) {
   myRecyclerView.scrollBy(myRecyclerView.getScrollX() + 2, myRecyclerView.getScrollY());
   if (!flag) {
    handler.sendEmptyMessageDelayed(0x00, 100);
   }
  }

这样,在页面进行切换时,消息不再滚动了。

2.第二个优化,

禁止手动滚动消息,最上面那个效果图,可以看出,我们可以用手滚动消息,如果不想让用户用手滚动,则禁止响应move事件即可,由我们的布局文件可知,RecyclerView的父布局是LinearLayout,我们可以自定义LinearLayout,拦截掉move事件即可,代码如下:

public class ForbidMoveLinearLayout extends LinearLayout {
 public ForbidMoveLinearLayout(Context context) {
  super(context);
 }
 public ForbidMoveLinearLayout(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 public ForbidMoveLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
 }
 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
  if (ev.getAction() == MotionEvent.ACTION_MOVE){
   return true;
  }
  return super.onInterceptTouchEvent(ev);
 }
}

我们的布局文件进行相应调整:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
 

这样就禁止手动滑动了,效果图就不贴了,可以自己试一下。看起来也不是那么难,但是如果想不到这个思路,就不好下手了。

Ok,到此结束。

总结

以上所述是小编给大家介绍的Android 实现通知消息水平播放、无限循环效果,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
author-avatar
seazz2001
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有