APP中常见上下循环滚动通知的简单实现,点击可进入详情

关注finddreams博客,一起分享一起进步!http://blog.csdn.net/finddreams/article/details/45025865

  对于能上下滚动的消息,我们并不陌生,常常在一些电商类的APP上有看到,比如淘宝之类的。大概的效果是一个不断上下循环滚动的通知,点击这个通知即可进去消息的详情界面。运行效果如下: 
  
(PS:别只顾看美女了,通知消息在下面)

   这样的效果图是很多App中常见的布局,上面一个循环滚动的广告条,紧接着下面又是一个不断上下滚动的通知。关于循环滚动的广告条,我在之前的博客已经介绍过了,想了解的可以去看看,Android循环滚动广告条的完美实现,封装方便,平滑过渡,从网络加载图片,点击广告进入对应网址。 
   
  今天我们主要着重来讲一下上下循环滚动通知实现的思路,实现的方式可能有多种,这里介绍一种ViewFlipper+动画来实现的方法;主要代码如下: 

private void initRollNotice() {
FrameLayout main_notice = (FrameLayout) findViewById(R.id.main_notice);
notice_parent_ll = (LinearLayout) getLayoutInflater().inflate(
R.layout.layout_notice, null);
notice_ll = ((LinearLayout) this.notice_parent_ll
.findViewById(R.id.homepage_notice_ll));
notice_vf = ((ViewFlipper) this.notice_parent_ll
.findViewById(R.id.homepage_notice_vf));
main_notice.addView(notice_parent_ll);
TimerTask task = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() { @Override
public void run() {
moveNext();
Log.d("Task", "下一个");
}
}); }
};
Timer timer = new Timer();
timer.schedule(task, 0, 4000);
} private void moveNext() {
setView(this.mCurrPos, this.mCurrPos + 1);
this.notice_vf.setInAnimation(this, R.anim.in_bottomtop);
this.notice_vf.setOutAnimation(this, R.anim.out_bottomtop);
this.notice_vf.showNext();
} private void setView(int curr, int next) { View noticeView = getLayoutInflater().inflate(R.layout.notice_item,
null);
TextView notice_tv = (TextView) noticeView.findViewById(R.id.notice_tv);
if ((curr < next) && (next > (titleList.size() - 1))) {
next = 0;
} else if ((curr > next) && (next < 0)) {
next = titleList.size() - 1;
}
notice_tv.setText(titleList.get(next));
notice_tv.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
Bundle bundle = new Bundle();
bundle.putString("url", linkUrlArray.get(mCurrPos));
bundle.putString("title", titleList.get(mCurrPos));
Intent intent = new Intent(MainActivity.this,
BaseWebActivity.class);
intent.putExtras(bundle);
startActivity(intent);
}
});
if (notice_vf.getChildCount() > 1) {
notice_vf.removeViewAt(0);
}
notice_vf.addView(noticeView, notice_vf.getChildCount());
mCurrPos = next; }

  从代码中我们可以看到先加载一个布局文件layout_notice.xml,然后在你想要显示的地方addView加进去。这样消息通知View就可以显示到你指定的地方。 
   
  layout_notice.xml布局文件的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" > <LinearLayout
android:id="@+id/homepage_notice_ll"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/gray_bg"
android:orientation="horizontal" > <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/margin_12"
android:paddingLeft="@dimen/vi_margin"
android:paddingRight="@dimen/margin_8"
android:paddingTop="@dimen/margin_12"
android:src="@drawable/notice_icon" /> <ViewFlipper
android:id="@+id/homepage_notice_vf"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout> </LinearLayout>

  然后就是通过setView根据集和中的位置把TextView放入到ViewFlipper中进行显示。同时给ViewFlipper加上动画效果,最后调用showNext();方法,循环到下一个TextView的显示。 
  同时我们给了TextView注册了点击事件,当点击到TextView的时候,根据这个TextView的位置,获得url地址,然后进入WebView的界面。 
   
 动画文件.in_bottomtop.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" > <translate
android:duration="500"
android:fromYDelta="100.0%p"
android:toYDelta="0.0" /> <alpha
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0" /> </set>

动画文件out_topbottom.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" > <translate
android:duration="500"
android:fromYDelta="0.0"
android:toYDelta="100.0%p" /> <alpha
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0.0" /> </set>

解释一下这段代码:

TimerTask task = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
moveNext();
Log.d("Task", "下一个");
}
}); }
};
Timer timer = new Timer();
timer.schedule(task, 0, 4000);

  实现定时的不断上下循环滚动,我们这里使用的是一个TimeTask的类,为了能够动态在子线程中修改UI,我们调用了一个runOnUiThread方法,该方法是运行在UI线程中的,所以可以对UI进行更改,不会报错。 
  这是上下循环滚动消息的简单实现,其实我们还可以通过监听onTouch事件,做到让消息滚动的方向随着手指滑动的方向变化,比如说手指上滑则可以显示上一个消息,这样体验就更加的人性化。 
  这个功能是很有必要的添加上去的,因为时间的关系就先做这么多,如果哪位大神能帮忙实现这个功能,自当感激不尽。 
  代码是加入到之前滚动广告条的代码中了,并会保持更新,这也是使用GitHub来托管代码的好处。 
  https://github.com/finddreams/ADBannerUI

APP中常见上下循环滚动通知的简单实现,点击可进入详情的更多相关文章

  1. 天猫京东app中常见的上下滚动轮播效果如何实现?

    前段时间,公司安排我制作一个上下滚动轮播效果,类似于我们在天猫京东app中常见的这样: 哇kao!这个我完全不会呀??? 幸好,前几天一个朋友在朋友圈分享了一篇推文.瞬间引领我走出了迷茫,这个教程特别 ...

  2. 移动App中常见的Web漏洞

    智能手机的存在让网民的生活从PC端开始往移动端转向,现在网民的日常生活需求基本上一部手机就能解决.外卖,办公,社交,银行转账等等都能通过移动端App实现.那么随之也带来了很多信息安全问题,大量的用户信 ...

  3. Sql server存储过程中常见游标循环用法

    用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE ), ), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELE ...

  4. 实现图片的循环滚动——JS的简单应用

    首先默认都了解JS的循环分支运算符等基本语法 用CSS实现简单的布局也是会的. 然后我们就可以来了解一下 [DOM 树节点] 它分为三大类:元素节点.文本节点.属性节点 文本节点跟属性节点为元素节点的 ...

  5. ViewPager封装工具类: 轻松实现APP导航或APP中的广告栏

    相信做app应用开发的,绝对都接触过ViewPager,毕竟ViewPager的应用可以说无处不在:APP第一次启动时的新手导航页,APP中结合Fragment实现页面滑动,APP中常见的广告栏的自动 ...

  6. 深入了解JavaScript中的for循环

    在ECMAScript5中,有三种for循环,分别是: 简单for循环 for-in forEach 在ES6中,新增了一种循环 for-of 简单for循环 const arr = [1, 2, 3 ...

  7. jQuery 实现列表自动滚动循环滚动显示新闻通知

    需求 页面中一个小区域循环滚动展示通知(公告.新闻.活动.图片等),并且鼠标hover时停止滚动并提示,鼠标离开后,继续滚动. 效果图 https://www.iguopin.com/index.ph ...

  8. Cocos2dx中利用双向链表实现无限循环滚动层

    [Qboy原创] 在Cocos2dX 3.0 中已经实现一些牛逼的滚动层,但是对于有一些需要实现循环滚动的要求确没有实现,笔者在前段时间的一个做了一个游戏,需求是实现在少有的(13个)英雄中进行循环滚 ...

  9. 总结XX网app中webapp常见的前端错误。

    在2016年12月至2017年1月,这一个月的时间内,我参与了易政网app中webapp前端项目的工作,下面将我在此次项目中犯的错误总结起来,以防下次再犯.也终于知道之前看的文章中的一段话所代表的意义 ...

随机推荐

  1. 修改虚拟机上Linux系统的IP地址

    然后再输入:ifconfig eth0 192.168.11.6 netmask 255.255.255.0   . 这样就可以把网卡eth0的IP地址修改为 192.168.11.6

  2. Redis--各个数据类型最大存储量

    原文地址:https://redis.io/topics/data-types Strings类型:一个String类型的value最大可以存储512M Lists类型:list的元素个数最多为2^3 ...

  3. 高级C代码的汇编分析

    在windows上,常用的函数调用方式有: Pascal方式,WINAPI(_stdcall)方式 和C方式(_cdecl) _cdecl调用规则: 1,参数从右到左入堆栈 2,在函数返回后,调用者要 ...

  4. BZOJ 3876:支线剧情(有下界最小费用最大流)

    3876: [Ahoi2014]支线剧情 Description [故事背景]宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧 ...

  5. springboot 实现自定义注解

    1.定义一个注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface T ...

  6. 【COGS 461】[网络流24题] 餐巾 最小费用最大流

    既然是最小费用最大流我们就用最大流来限制其一定能把每天跑满,那么把每个表示天的点向T连流量为其所需餐巾,费用为0的边,然后又与每天的餐巾对于买是无限制的因此从S向每个表示天的点连流量为INF,费用为一 ...

  7. 设置edittext的样式

    1.在res->drawable编写 <?xml version="1.0" encoding="utf-8"?> <shape xml ...

  8. jquery学习总计

    1,jquery的基础语法 $(selector).action(); 选择器(selector)查询和查找html元素,action()执行对函数的操作. 2.选择器 id,类,类型,属性,属性值等 ...

  9. .NET的PE文件结构篇(转)

    一.开篇 开篇我要讲述一个关于PE文件结构的文章,这篇文章动手能力比较强,希望大家能够动手进行操作,这边文章篇幅有可能会长一些,为了方便大家阅读我可以将其分为几个部分进行讲解,主要分为以下几个部分: ...

  10. 用户线程 (User Thread)、守护线程 (Daemon Thread)

    在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称 ...