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布局里添加:
随机推荐
- Android 安全概述
1. 保密: 信息.文档加密.解密 2. 鉴别.认证:就像确认与我们打电话的确实是XXX,而不是骗子 3. 完整性:信息不能被篡改, 4. 不可否认性:确定信息有who产生,并且将来不能否认
- General Purpose Hash Function Algorithms
General Purpose Hash Function Algorithms post@: http://www.partow.net/programming/hashfunctions/inde ...
- ASP.NET MVC轻教程 Step By Step 4——Model、View和Controller
ASP.NET MVC中的Model(数据模型)主要包括定义数据结构.数据库读写.数据验证等等和对象处理相关的工作. 在解决方案资源管理器中找到Model文件夹,点击右键,添加一个新类,名为“Mess ...
- 通过javascript实现1~100内能同时被2和3整除的数并生成如下表格
请通过javascript实现1~100内能同时被2和3整除的数并生成如下表格: <!DOCTYPE html><html lang="en"><he ...
- GHOST还原
整理日: 2015年2月16日 GHOST GHO2Disk STEP01 STEP02 STEP03 STEP04 STEP05 STEP06 STEP07
- Phonegap 3.0 获取当前地址位置
新版本的cordova 3.0 中,使用官方的示例可直接获取当前手机的地理位置,前提是手机开启了gps,或可联网. 获取到的是经纬度坐标值等信息,可通过google api 实现通过经纬度获取当前地理 ...
- 如何查看Windows下端口占用
查看端口占用的PID进程号 C:\Users\yan>netstat -ano | findstr "8888" 查看是哪个进程或者程序占用了17840端口 C:\Users ...
- 5个提升Google Chrome浏览器运行速度的技巧
尽管有无数个喜欢Google Chrome 浏览器的理由,其中就包括,Chrome已经够快了,但Google Chrome的内存占用而导致的速度拖累还是广受诟病,这种弊端在windows下尤为明显, ...
- 与QString("我是中文")完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。
在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的 ...
- PL/SQL 程序块
DECLARE BARCODE VARCHAR(50); BEGIN BARCODE := 'A'; IF BARCODE<>'A' then SELECT 1 FROM sam_user ...