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布局里添加:
随机推荐
- 搭建laravel5全面教学,爬坑(windows下)。
1.首先下载屌比的Composer 2.然后下载composer.phar 3.然后下载最新版Laravel框架 4.将下载下来的laravel压缩包扔到htdocs目录下(扔到别的目录没试过) 5. ...
- C# Winform开发框架模块图(平台核心模块+示例模块)
企业版V4.0 - 模块图 企业版V4.0 - 项目解决方案 Client/Server构架,有两个解决方案: 客户端解决方案说明: 服务端解决方案说明: C/S系统开发框架- ...
- dotnet core开发体验之开始MVC
开始 在上一篇文章:dotnet core多平台开发体验 ,体验了一把dotnet core 之后,现在想对之前做的例子进行改造,想看看加上mvc框架是一种什么样的体验,于是我就要开始诞生今天的这篇文 ...
- 关于C# 调用 C dll时,抓获C的异常
最近一直被C# 调用native code时的内存错误,各种错误所困扰.而且在.net 4.0中非托管代码的异常不能被托管代码抓获,导致程序直接crash. 最终找到了.net 的方法.MSDN有关于 ...
- WPF DataGrid
前台代码 <DataGrid Name="gv_GetWork" AutoGenerateColumns="False" CanUserSortColum ...
- 0x1L
整形常量的后缀表示其类型,包括如下后缀,其中U和L的大小写通用 后缀 类型L long int LL long long int U ...
- 编译direct show 的filter项目
最近搞windows编程,想学习一下direct show.编译了一下sdk里面的一个sample filter,做个笔记,记录一下. 说来渐愧,vc也用了n久了,还没有自己动手建立一个正式的项目,都 ...
- myeclipse如何修改Web项目名称
1. 使用myeclipse进行Web项目开发时,有时候项目名称重命名了,但是WEB项目在tomcat里边的名称还是原来的名称,是需要重新命名的.下边详细介绍一下如果和修改web项目名称,myecli ...
- 【转】unity3d input输入
Input 输入 按键 Input.GetKey(“up”) = Input.GetKey(KeyCode.UpArrow) 按住键盘上键 Input.GetKeyDown (“up”) 按下键盘上键 ...
- 《算法问题实战策略》——chaper9——动态规划法技巧
Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1) 拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2) 棋盘中还剩 ...