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布局里添加:
随机推荐
- mysql update不能直接使用select的结果
在sql server中,我们可是使用以下update语句对表进行更新:update a set a.xx= (select yy from b) ;但是在mysql中,不能直接使用set selec ...
- linux无法umount解决方案
[root@995120-master ~]# umount /drbd/ umount: /drbd: device is busy.(In some cases useful info about ...
- 《python源码剖析》笔记一——python编译
1.python的架构: 2.python源码的组织结构: 3.windows环境下编译python:
- MAC Python环境配置以及安装Pycharm 5.4.0
安装XCODE 去APP STORE下载,然后安装.免费 终端执行 xcode-select --install 安装或更新命令行开发工具 安装Pycharm 下载软件 官网:https://www. ...
- matlab函数之bsxfun
bsxfun(fun,A,B) 偶然间发现了这个函数,强大得不得了呀,它的作用是:对两个矩阵A和B之间的每一个元素进行指定的计算(函数fun指定):并且具有自动扩维的作用 例如,A是一个4*3的矩阵, ...
- 关于执行ST_Geometry的st_centroid函数时报ORA-28579错误的问题
环境 SDE版本:10./10.2/10.2.1/10.2.2 Oracle版本:11g R2 11.2.0.1 Windows版本:Windows Server 2008 R2 问题描述及原因 以全 ...
- hdu3949 XOR xor高斯消元
XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Git命令详解
一个中文git手册:http://progit.org/book/zh/ 原文:http://blog.csdn.net/sunboy_2050/article/details/7529841 前面两 ...
- 《Effective C++》条款14 总是让base class拥有virtual destructor
有时,一个类想跟踪它有多少个对象存在.一个简单的方法是创建一个静态类成员来统计对象的个数.这个成员被初始化为0,在构造函数里加1,析构函数里减1.(条款m26里说明了如何把这种方法封装起来以便很容易地 ...
- bzoj3631
其实这道题其实可以转化为这样一个问题 给定n-1对点,将这两点x,y间简单路径上的点(包括起点终点)权值+1 (最后再把除了起点外的点的权值-1,注意终点没糖吃) 求每个点的权值 首先想到的是先找LC ...