package com.genius.scroll;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller;
import com.genius.demo.MainActivity;
public class MyScrollLayout extends ViewGroup {
private static final String TAG = "MyScrollLayout";
/** 用于判断甩动手势 **/
private VelocityTracker mVelocityTracker;
private static final int SNAP_VELOCITY = 600;
/** 滑动控制器 **/
private Scroller mScroller;
private int mCurScreen;
private int mDefaultScreen = 0;
private float mLastMotionX;
/** 当前页码 **/
private int currentPage;
/** 总页码 **/
private int pagesize;
private Context mContext;// 上下文对象
private OnViewChangeListener mOnViewChangeListener;// View滚动监听器
/** 标注是否跳转到主界面了 **/
private boolean go_main = false;
private SharedPreferences preferences;
public MyScrollLayout(Context context) {
super(context);
this.mContext = context;
init(context);
}
public MyScrollLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
init(context);
}
public MyScrollLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.mContext = context;
init(context);
}
/**
* 获取当前页码
*
* @param page
*/
public void setPosition(int page) {
if (page > 0) {
currentPage = page;
}
}
/**
* 获取总页数
*
* @param size
*/
public void setPageSize(int size) {
pagesize = size;
}
private void init(Context context) {
mCurScreen = mDefaultScreen;
mScroller = new Scroller(context);
}
/**
* 调用场景:在view给其孩子设置尺寸和位置时被调用 参数说明: 参数一:view有新的尺寸或位置; 参数二:相对于父view的Left位置;
* 参数三:相对于父view的Top位置; 参数四:相对于父view的Right位置; 参数五:相对于父view的Bottom位置.
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (changed) {// 如果有新的尺寸或位置
int childLeft = 0;
final int childCount = getChildCount();// 返回子View的总数
for (int i = 0; i < childCount; i++) {// 遍历子View
final View childView = getChildAt(i);
if (childView.getVisibility() != View.GONE) {
// childView.getMeasuredWidth()對View上的內容進行測量後得到的View內容佔據的寬度,前提是你必須在父佈局的
// onLayout()方法或者此View的onDraw()方法裡調用measure(0,0);(measure
// 參數的值你可以自己定義),否則你得到的結果和getWidth()得到的結果一樣
final int childWidth = childView.getMeasuredWidth();
// 参数(相对于父布局的左、上、右、下的位置)
childView.layout(childLeft, 0, childLeft + childWidth,
childView.getMeasuredHeight());
childLeft += childWidth;
}
}
}
}
/**
* 指明控件可获得的空间以及关于这个空间描述的元数据.
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。一个MeasureSpec由大小和模式组成
final int width = MeasureSpec.getSize(widthMeasureSpec);// 根据提供的测量值提取大小值
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);// 根据提供的测量值(格式)提取模式(有三种模式)
Log.d(TAG, "onMeasure width:" + width + " widthMode:" + widthMode);
final int count = getChildCount();// 获取子视图总数
for (int i = 0; i < count; i++) {
// 调用子视图
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
}
scrollTo(mCurScreen * width, 0);
}
public void snapToDestination() {
final int screenWidth = getWidth();
final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;
snapToScreen(destScreen);
}
public void snapToScreen(int whichScreen) {
// 得到有效的页面布局
whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
if (getScrollX() != (whichScreen * getWidth())) {
final int delta = whichScreen * getWidth() - getScrollX();
mScroller.startScroll(getScrollX(), 0, delta, 0,
Math.abs(delta) * 2);
mCurScreen = whichScreen;
invalidate(); // 重绘布局
if (mOnViewChangeListener != null) {
mOnViewChangeListener.OnViewChange(mCurScreen);
}
}
}
/**
* View绘制流程draw()中会调用
*/
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {// 如果返回true,表示动画还没有结束
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());// 产生平滑的动画效果,根据当前偏移量,每次滚动一点
postInvalidate();// 此时同样也需要刷新View ,否则效果可能有误差
} else {// 如果返回false,表示startScroll完成
Log.i(TAG, "scoller has finished");
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
final float x = event.getX();
final float y = event.getY();
Log.d(TAG, "X:" + x + " Y:" + y);
float oldx = 0;
switch (action) {
case MotionEvent.ACTION_DOWN:
oldx = event.getRawX();
Log.i("", "onTouchEvent ACTION_DOWN");
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(event);
}
if (!mScroller.isFinished()) {
mScroller.abortAnimation();
}
mLastMotionX = x;
break;
case MotionEvent.ACTION_MOVE:
int deltaX = (int) (mLastMotionX - x);
float newX = event.getRawX();
/**
* 最后一页跳转 by 木木
*/
if (newX - oldx > 3) {
if (currentPage == pagesize - 1 && !go_main) {
go_main = true;
preferences = mContext.getSharedPreferences("setting", 0);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("isOpen", true);
editor.commit();
Intent intent = new Intent();
intent.setClass(mContext, MainActivity.class);
mContext.startActivity(intent);
}
}
if (IsCanMove(deltaX)) {
if (mVelocityTracker != null) {
mVelocityTracker.addMovement(event);
}
mLastMotionX = x;
scrollBy(deltaX, 0);
}
break;
case MotionEvent.ACTION_UP:
int velocityX = 0;
if (mVelocityTracker != null) {
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1000);
velocityX = (int) mVelocityTracker.getXVelocity();
}
if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
// 向左移动
Log.e(TAG, "snap left");
snapToScreen(mCurScreen - 1);
} else if (velocityX < -SNAP_VELOCITY
&& mCurScreen < getChildCount() - 1) {
// 向右移动
Log.e(TAG, "snap right");
snapToScreen(mCurScreen + 1);
} else {
snapToDestination();
}
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
mVelocityTracker = null;
}
break;
}
return true;
}
private boolean IsCanMove(int deltaX) {
if (getScrollX() <= 0 && deltaX < 0) {
return false;
}
if (getScrollX() >= (getChildCount() - 1) * getWidth() && deltaX > 0) {
return false;
}
return true;
}
public void SetOnViewChangeListener(OnViewChangeListener listener) {
mOnViewChangeListener = listener;
}
// /**
// * 判断是
没有合适的资源?快使用搜索试试~ 我知道了~
Android App引导页面效果实现
共55个文件
png:20个
class:12个
java:7个
3星 · 超过75%的资源 需积分: 11 226 下载量 184 浏览量
2015-08-29
20:49:50
上传
评论 1
收藏 1.41MB ZIP 举报
温馨提示
Android App引导页面效果实现 欢迎访问我的博客:http://blog.csdn.net/yayun0516
资源推荐
资源详情
资源评论
收起资源包目录
SwitchViewDemo.zip (55个子文件)
SwitchViewDemo
.project 850B
project.properties 562B
proguard.cfg 1KB
src
com
genius
demo
ViewPageAdapter.java 1KB
MainActivity.java 629B
SwitchViewDemoActivity.java 2KB
scroll
MyScrollLayout.java 8KB
OnViewChangeListener.java 110B
lib
android-support-v4.jar 137KB
AndroidManifest.xml 875B
res
drawable-ldpi
icon.png 2KB
drawable-hdpi
guide04.9.png 36KB
guide_dot_white.png 192B
icon.png 4KB
guide_dot_black.png 192B
guide03.9.png 40KB
guide01.9.png 42KB
guide02.9.png 33KB
guide05.9.png 34KB
drawable
guide_round.xml 302B
drawable-mdpi
icon.png 3KB
layout
main.xml 3KB
drawable-xhdpi
values
strings.xml 187B
.settings
org.eclipse.core.resources.prefs 88B
assets
gen
com
genius
demo
BuildConfig.java 157B
R.java 1KB
.classpath 540B
bin
resources.ap_ 374KB
classes
com
genius
demo
R$layout.class 385B
BuildConfig.class 339B
R$drawable.class 659B
R$attr.class 331B
R$id.class 441B
ViewPageAdapter.class 2KB
R.class 510B
R$string.class 418B
SwitchViewDemoActivity.class 2KB
MainActivity.class 1KB
scroll
MyScrollLayout.class 7KB
OnViewChangeListener.class 169B
AndroidManifest.xml 875B
dexedLibs
annotations-9564ccdbe362d2176ca30c06741196bc.jar 1KB
jarlist.cache 120B
res
crunch
drawable-ldpi
icon.png 2KB
drawable-hdpi
guide04.9.png 71KB
guide_dot_white.png 192B
icon.png 4KB
guide_dot_black.png 192B
guide03.9.png 78KB
guide01.9.png 85KB
guide02.9.png 62KB
guide05.9.png 63KB
drawable-mdpi
icon.png 2KB
classes.dex 14KB
SwitchViewDemo.apk 383KB
共 55 条
- 1
资源评论
- JOJOyhq2015-10-10今天看了好多代码!继续,加油!!!
- gxtyzhw2016-08-25好谢谢,不错
- BingoRiver2015-09-20其实用ViewPager+Fragment就好啦,方便,快捷
yayun0516
- 粉丝: 2183
- 资源: 59
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功