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中常见上下循环滚动通知的简单实现,点击可进入详情的更多相关文章
- 天猫京东app中常见的上下滚动轮播效果如何实现?
前段时间,公司安排我制作一个上下滚动轮播效果,类似于我们在天猫京东app中常见的这样: 哇kao!这个我完全不会呀??? 幸好,前几天一个朋友在朋友圈分享了一篇推文.瞬间引领我走出了迷茫,这个教程特别 ...
- 移动App中常见的Web漏洞
智能手机的存在让网民的生活从PC端开始往移动端转向,现在网民的日常生活需求基本上一部手机就能解决.外卖,办公,社交,银行转账等等都能通过移动端App实现.那么随之也带来了很多信息安全问题,大量的用户信 ...
- Sql server存储过程中常见游标循环用法
用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE ), ), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELE ...
- 实现图片的循环滚动——JS的简单应用
首先默认都了解JS的循环分支运算符等基本语法 用CSS实现简单的布局也是会的. 然后我们就可以来了解一下 [DOM 树节点] 它分为三大类:元素节点.文本节点.属性节点 文本节点跟属性节点为元素节点的 ...
- ViewPager封装工具类: 轻松实现APP导航或APP中的广告栏
相信做app应用开发的,绝对都接触过ViewPager,毕竟ViewPager的应用可以说无处不在:APP第一次启动时的新手导航页,APP中结合Fragment实现页面滑动,APP中常见的广告栏的自动 ...
- 深入了解JavaScript中的for循环
在ECMAScript5中,有三种for循环,分别是: 简单for循环 for-in forEach 在ES6中,新增了一种循环 for-of 简单for循环 const arr = [1, 2, 3 ...
- jQuery 实现列表自动滚动循环滚动显示新闻通知
需求 页面中一个小区域循环滚动展示通知(公告.新闻.活动.图片等),并且鼠标hover时停止滚动并提示,鼠标离开后,继续滚动. 效果图 https://www.iguopin.com/index.ph ...
- Cocos2dx中利用双向链表实现无限循环滚动层
[Qboy原创] 在Cocos2dX 3.0 中已经实现一些牛逼的滚动层,但是对于有一些需要实现循环滚动的要求确没有实现,笔者在前段时间的一个做了一个游戏,需求是实现在少有的(13个)英雄中进行循环滚 ...
- 总结XX网app中webapp常见的前端错误。
在2016年12月至2017年1月,这一个月的时间内,我参与了易政网app中webapp前端项目的工作,下面将我在此次项目中犯的错误总结起来,以防下次再犯.也终于知道之前看的文章中的一段话所代表的意义 ...
随机推荐
- C++版本的C标准库头文件的特点
C++标准库中除了定义C++语言特有的功能外,也兼容了C语言的标准库.C语言的头文件形如name.h,C++则将这些文件命名为cname.也就是去掉了.h后缀,而在文件名name之前添加了字母c,这里 ...
- 201621044079WEEK06-接口、内部类
作业06-接口.内部类 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多 ...
- hihocoder 1320 压缩字符串(字符串+dp)
题解: 其实就是对应三种dp的转移方式 1.拼接类型 dp[i][j] = dp[i][c] + dp[c][j] 2.不变类型 dp[i][j] = j-i+1 3.重复类型(必须满足有k个循环节) ...
- [洛谷P1430]序列取数
题目大意:给定一个序列$s$,每个人每轮可以从两端(任选一端)取任意个数的整数,不能不取.在两个人都足够聪明的情况下,求先手的最大得分. 题解:设$f_{i,j}$表示剩下$[i,j]$,先手的最大得 ...
- 网络编程:listen函数
listen函数仅由TCP服务器调用,它做两件事: 当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字.listen函数把一个未连 ...
- SqlServer中临时表的应用
一.变通处理WHERE后面IN的参数过多 WHERE后面的条IN操作符里的参数比较小时,可以直接使用IN(1,2,3)这样处理,当个数不确定(可能超过1000)时,应该考虑使用临时表关联查询: SEL ...
- Codeforces Round #350 (Div. 2) B
B. Game of Robots time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- HDU 多校对抗赛 J Time Zone
Time Zone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 注意@Bean中的initMethod和destroyMethod
@Configuration public class AppConfig { @Bean(initMethod = "init") public Foo foo() { retu ...
- JavaScript 被忽视的细节
语句/表达式 换个角度理解语句(statemaents)和表达式(expressions):表达式不会改变程序的运行状态,而语句会.还有一种叫做表达式语句,可以理解为表达式和语句的交集,如({a:1} ...