欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-11-30 23:35:10
今天我们来实现一个简单的效果,通知消息无限循环播放,先看效果图: 这个效果也很常见,实现的方法也有很多,我是使用recyclerview来实现的,觉得还是挺不错的,就...

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

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 >
 <android.support.v7.widget.recyclerview
  android:id="@+id/myrecyclerview"
  android:layout_width="match_parent"
  android:layout_height="36dp"
  android:layout_margintop="20dp"
  android:background="#faf7bb"
  >
 </android.support.v7.widget.recyclerview>
</linearlayout>

接下来看一下mainactivity的代码:

public class mainactivity extends activity {
 @bindview(r.id.myrecyclerview)recyclerview myrecyclerview;
 private list<string> 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<myviewholder>{
  @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);
 }
}

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

<?xml version="1.0" encoding="utf-8"?>
<com.example.administrator.helloapplication.forbidmovelinearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 >
 <android.support.v7.widget.recyclerview
  android:id="@+id/myrecyclerview"
  android:layout_width="match_parent"
  android:layout_height="36dp"
  android:layout_margintop="20dp"
  android:background="#faf7bb"
  >
 </android.support.v7.widget.recyclerview>
</com.example.administrator.helloapplication.forbidmovelinearlayout>

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

ok,到此结束。

总结

以上所述是小编给大家介绍的android 实现通知消息水平播放、无限循环效果,希望对大家有所帮助