Android 仿网易新闻v3.5:上下滑动的引导页
版权声明:本文为博主原创文章,未经博主允许不得转载。
在很多天气或者新闻的应用中,我们都能看到一些字幕滚动的效果,最简单的实现为跑马灯效果,用系统提供的属性即可实现. 复杂一些的就需要自己去用自定义控件实现. 比如 让TextView 实现垂直滚动. 这里我要讲的是垂直滚动的字幕效果,并且内容并不仅为文字,还可以加入图片或者其他元素. 废话不多说,还是直接上效果图:

首先还是看一下核心的实现:
目前我的做法是重写了ScrollView,对外提供几个重要的方法:
isScrolled()方法判断当前是否为滚动状态
setScrolled(boolean flag)设置滚动的开关
setPeriod(long period)设置从开始滚动到结束的时间
setSpeed(long speed)设置滚动的速度
下面说一些需要注意的地方:
1.由于是定时操作,所以需要在Activity的对应生命周期进行处理: 当界面由不可见到可见时,设置setScrolled(true)打开滚动开关,由可见到不可见时,setScrolled(false)
关闭开关
2. 可根据自己需要调用setPeriod(long period)和setSpeed(long speed)控制滚动的速度
3. 由于是ScrollView实现的,中间放置的内容同ScrollView,不仅仅可以设置文字,还可以添加图片等其他元素,实现复杂的UI
4. 图文混排, 目前这个DEMO我还没做细致处理. 最主要的部分就是文字的处理,需要考虑中英文,全角半角,字体大小,段落处理,计算对应的字符宽高等进行排版
图片等资源处理的部分就相对要简单,主要处理分辨率与计算宽高
关于这些部分,之后我会慢慢做细致讲解.
这个Demo是我临时写的,UI和图文混排包括具体的滚动部分处理都相对简单,大家可以在这个例子的基础上进行扩展,根据需求做出自己想要的效果:
Demo下载地址:http://download.csdn.net/detail/t12x3456/5875157
下面是对应的代码:
首先是自定义View:
- package com.tony.autoscroll;
- import android.content.Context;
- import android.os.Handler;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.widget.ScrollView;
- /**
- * @author Tony
- *
- */
- public class AutoScrollView extends ScrollView {
- private final Handler handler = new Handler();
- private long duration = 50;
- private boolean isScrolled = false;
- private int currentIndex = 0;
- private long period = 1000;
- private int currentY = -1;
- private double x;
- private double y;
- private int type = -1;
- /**
- * @param context
- */
- public AutoScrollView(Context context) {
- this(context, null);
- }
- /**
- * @param context
- * @param attrs
- */
- public AutoScrollView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
- /**
- * @param context
- * @param attrs
- * @param defStyle
- */
- public AutoScrollView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
- public boolean onTouchEvent(MotionEvent event) {
- int Action = event.getAction();
- switch (Action) {
- case MotionEvent.ACTION_DOWN:
- x=event.getX();
- y=event.getY();
- if (type == 0) {
- setScrolled(false);
- }
- break;
- case MotionEvent.ACTION_MOVE:
- double moveY = event.getY() - y;
- double moveX = event.getX() - x;
- if ((moveY>20||moveY<-20) && (moveX < 50 || moveX > -50) && getParent() != null) {
- getParent().requestDisallowInterceptTouchEvent(true);
- }
- break;
- case MotionEvent.ACTION_UP:
- if (type == 0) {
- currentIndex = getScrollY();
- setScrolled(true);
- }
- break;
- default:
- break;
- }
- return super.onTouchEvent(event);
- }
- @Override
- public boolean onInterceptTouchEvent(MotionEvent p_event)
- {
- return true;
- }
- /**
- * 判断当前是否为滚动状态
- *
- * @return the isScrolled
- */
- public boolean isScrolled() {
- return isScrolled;
- }
- /**
- * 开启或者关闭自动滚动功能
- *
- * @param isScrolled true为开启,false为关闭
- */
- public void setScrolled(boolean isScrolled) {
- this.isScrolled = isScrolled;
- autoScroll();
- }
- /**
- * 获取当前滚动到结尾时的停顿时间,单位:毫秒
- *
- * @return the period
- */
- public long getPeriod() {
- return period;
- }
- /**
- * 设置当前滚动到结尾时的停顿时间,单位:毫秒
- *
- * @param period
- * the period to set
- */
- public void setPeriod(long period) {
- this.period = period;
- }
- /**
- * 获取当前的滚动速度,单位:毫秒,值越小,速度越快。
- *
- * @return the speed
- */
- public long getSpeed() {
- return duration;
- }
- /**
- * 设置当前的滚动速度,单位:毫秒,值越小,速度越快。
- *
- * @param speed
- * the duration to set
- */
- public void setSpeed(long speed) {
- this.duration = speed;
- }
- public void setType(int type){
- this.type = type;
- }
- private void autoScroll() {
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- boolean flag = isScrolled;
- if (flag) {
- if (currentY == getScrollY()) {
- try {
- Thread.sleep(period);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- currentIndex = 0;
- scrollTo(0, 0);
- handler.postDelayed(this, period);
- } else {
- currentY = getScrollY();
- handler.postDelayed(this, duration);
- currentIndex++;
- scrollTo(0, currentIndex * 1);
- }
- } else {
- //currentIndex = 0;
- //scrollTo(0, 0);
- }
- }
- }, duration);
- }
- }
MainActivity:
- package com.tony.autoscroll;
- import com.example.testautoscroll.R;
- import android.os.Bundle;
- import android.app.Activity;
- /**
- * link: blog.csdn.net/t12x3456
- * @author Tony
- *
- */
- public class MainActivity extends Activity {
- private AutoScrollView scrollView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- scrollView = (AutoScrollView) findViewById(R.id.auto_scrollview);
- }
- @Override
- protected void onStart() {
- // TODO Auto-generated method stub
- if(!scrollView.isScrolled()){
- scrollView.setScrolled(true);
- }
- super.onStart();
- }
- @Override
- protected void onStop() {
- // TODO Auto-generated method stub
- if(scrollView.isScrolled()){
- scrollView.setScrolled(false);
- }
- super.onStop();
- }
- }
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456
Android 仿网易新闻v3.5:上下滑动的引导页的更多相关文章
- android 仿网易新闻首页框架
实现思路很简单左侧栏目是一个一个的 Fragment 的,点击时动态替换各个 Fragment 到当前 Activity 中. 关键代码: public void loadFragment(Ma ...
- 类似掌盟的Tab页 Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签 (转)
原博客地址 :http://blog.csdn.net/xiaanming/article/details/10766053 本文转载,记录学习用,如有需要,请到原作者网站查看(上面这个网址) 之前 ...
- Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9971721 大家都知道Android的ActionBar是在3.0以上才有的,那么在3 ...
- Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了能更好的分享高质量的文章,所以开设了此专栏.文章代码都以Android Studio亲测运行,读者朋友可在后面直接下载源码.该专栏 ...
- Android应用经典主界面框架之二:仿网易新闻client、CSDN client (Fragment ViewPager)
另外一种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表.使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View.而是Fragment.所 ...
- Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻clientTab标签
之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻clientTab标签的功能,ActionBarSherlock是在3.0下面的机器支持Ac ...
- Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherlock ...
- iOS仿网易新闻栏目拖动重排添加删除效果
仿网易新闻栏目选择页面的基本效果,今天抽了点时间教大家如何实现UICollectionView拖动的效果! 其实实现起来并不复杂,这里只是基本的功能,没有实现细节上的修改,连UI都是丑丑的样子,随手画 ...
- 仿网易新闻app下拉标签选择菜单
仿网易新闻app下拉标签选择菜单 仿网易新闻app下拉标签选择菜单,长按拖动排序,点击增删标签控件 ##示例 ##EasyTagDragView的使用 在layout布局里添加:
随机推荐
- linux下VI编辑器的使用
一.VI编辑器简述 VI 编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界面,使它成了效率很高的文本编辑器.尽管在Linux上也有很多图形界面的编辑器可 ...
- Xcode中报错或警告信息整理,持续更新...
整理报错和警告信息,为以后自己查看方便用! [报错1] 信息:Static table views are only valid when embedded in UITableViewContro ...
- bzoj 3632: 外太空旅行 最大团
3632: 外太空旅行 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 389 Solved: 129[Submit][Status] Descript ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 649 Solved: 305[Submit][Sta ...
- Java实现希尔排序
华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序.如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作). 看到了这 ...
- office web apps
http://technet.microsoft.com/zh-cn/library/ff431687.aspx http://www.cnblogs.com/erucy/archive/2012/0 ...
- Two shortest
sgu185:http://acm.sgu.ru/problem.php?contest=0&problem=185 题意:找两条最短路径,没有边相交的最短路劲,并且输出路径. 题解:这一题和 ...
- Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
1.Why 最近在写android画图经常用到这几个什么什么To,一开始还真不知道cubicTo这个方法,更不用说能不能分清楚它们了,所以特此来做个小笔记,记录下moveTo.lineTo.quadT ...
- ♫【Git】
git - 简易指南 (√) fatal:remote error:You can't push to git://github.com/username/*.git (√) git clone g ...
- 清除nginx静态资源缓存
之前写过一篇如何配置nginx缓存及手动清除缓存的文章: http://www.cnblogs.com/Eivll0m/p/4921829.html 但如果有大量缓存需要清理,手动一条条清理就比较慢了 ...