没有合适的资源?快使用搜索试试~ 我知道了~
本文实例讲述了Android编程实现小说阅读器滑动效果的方法。分享给大家供大家参考,具体如下: 看过小说都知道小说阅读器翻页有好多种效果,比如仿真翻页,滑动翻页,等等。由于某种原因,突然想写一个简单点的滑动翻页效果。在这里写出来也没有什么意图,希望大家可以根据这个效果举一反三,写出其他的效果。图就不上了。 下面是代码:大家理解onTouch事件即可 package com.example.testscroll.view; import android.content.Context; import android.util.AttributeSet; import android.view.
资源推荐
资源详情
资源评论
Android编程实现小说阅读器滑动效果的方法编程实现小说阅读器滑动效果的方法
本文实例讲述了Android编程实现小说阅读器滑动效果的方法。分享给大家供大家参考,具体如下:
看过小说都知道小说阅读器翻页有好多种效果,比如仿真翻页,滑动翻页,等等。由于某种原因,突然想写一个简单点的滑动
翻页效果。在这里写出来也没有什么意图,希望大家可以根据这个效果举一反三,写出其他的效果。图就不上了。
下面是代码:大家理解onTouch事件即可
package com.example.testscroll.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller;
public class FlipperLayout extends ViewGroup {
private Scroller mScroller;
private VelocityTracker mVelocityTracker;
private int mVelocityValue = 0;
/** 商定这个滑动是否有效的距离 */
private int limitDistance = 0;
private int screenWidth = 0;
/** 手指移动的方向 */
private static final int MOVE_TO_LEFT = 0;
private static final int MOVE_TO_RIGHT = 1;
private static final int MOVE_NO_RESULT = 2;
/** 最后触摸的结果方向 */
private int mTouchResult = MOVE_NO_RESULT;
/** 一开始的方向 */
private int mDirection = MOVE_NO_RESULT;
/** 触摸的模式 */
private static final int MODE_NONE = 0;
private static final int MODE_MOVE = 1;
private int mMode = MODE_NONE;
/** 滑动的view */
private View mScrollerView = null;
/** 最上层的view(处于边缘的,看不到的) */
private View currentTopView = null;
/** 显示的view,显示在屏幕 */
private View currentShowView = null;
/** 最底层的view(看不到的) */
private View currentBottomView = null;
public FlipperLayout(Context context) {
super(context);
init(context);
}
public FlipperLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public FlipperLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
mScroller = new Scroller(context);
screenWidth = context.getResources().getDisplayMetrics().widthPixels;
limitDistance = screenWidth / 3;
}
/***
*
* @param listener
* @param currentBottomView
* 最底层的view,初始状态看不到
* @param currentShowView
* 正在显示的View
* @param currentTopView
* 最上层的View,初始化时滑出屏幕
*/
public void initFlipperViews(TouchListener listener, View currentBottomView, View currentShowView, View currentTopView) {
this.currentBottomView = currentBottomView;
this.currentShowView = currentShowView;
this.currentTopView = currentTopView;
setTouchResultListener(listener);
addView(currentBottomView);
addView(currentShowView);
addView(currentTopView);
/** 默认将最上层的view滑动的边缘(用于查看上一页) */
currentTopView.scrollTo(-screenWidth, 0);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
int height = child.getMeasuredHeight();
int width = child.getMeasuredWidth();
child.layout(0, 0, width, height);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(width, height);
for (int i = 0; i < getChildCount(); i++) {
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
}
}
private int startX = 0;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!mScroller.isFinished()) {
break;
}
startX = (int) ev.getX();
break;
}
return super.dispatchTouchEvent(ev);
}
@SuppressWarnings("deprecation")
@Override
public boolean onTouchEvent(MotionEvent event) {
obtainVelocityTracker(event);
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
if (!mScroller.isFinished()) {
return super.onTouchEvent(event);
}
if (startX == 0) {
startX = (int) event.getX();
}
final int distance = startX - (int) event.getX();
if (mDirection == MOVE_NO_RESULT) {
if (mListener.whetherHasNextPage() && distance > 0) {
mDirection = MOVE_TO_LEFT;
} else if (mListener.whetherHasPreviousPage() && distance < 0) {
mDirection = MOVE_TO_RIGHT;
}
}
if (mMode == MODE_NONE
&& ((mDirection == MOVE_TO_LEFT && mListener.whetherHasNextPage()) || (mDirection == MOVE_TO_RIGHT && mListener
.whetherHasPreviousPage()))) {
mMode = MODE_MOVE;
}
if (mMode == MODE_MOVE) {
if ((mDirection == MOVE_TO_LEFT && distance <= 0) || (mDirection == MOVE_TO_RIGHT && distance >= 0)) {
mMode = MODE_NONE;
}
}
if (mDirection != MOVE_NO_RESULT) {
if (mDirection == MOVE_TO_LEFT) {
if (mScrollerView != currentShowView) {
mScrollerView = currentShowView;
}
} else {
if (mScrollerView != currentTopView) {
mScrollerView = currentTopView;
}
}
if (mMode == MODE_MOVE) {
mVelocityTracker.computeCurrentVelocity(1000, ViewConfiguration.getMaximumFlingVelocity());
if (mDirection == MOVE_TO_LEFT) {
mScrollerView.scrollTo(distance, 0);
剩余6页未读,继续阅读
资源评论
weixin_38621565
- 粉丝: 4
- 资源: 959
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于wxWidgets库的QMiniIDE游戏开发环境管理系统.zip
- 通过C++实现原型模式(Prototype Pattern).rar
- 学习记录111111111111111111111111
- 通过java实现原型模式(Prototype Pattern).rar
- 通过python实现原型模式(Prototype Pattern).rar
- xiefrnsdklmkds
- 基于PyQt5+pytorch的在线疲劳检测系统项目源码+文档说明(Python毕业设计)
- Excel表格拆分工具.exe
- Python毕业设计基于PyQt5+pytorch的在线疲劳检测系统项目源码+文档说明
- 基于Unity开发的消消乐小游戏源代码(毕业设计和大作业适用).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功