您的位置:首页 > 移动开发 > Android开发

【Android】【完善】【凯子哥带你夯实应用层】滚来滚去,滚来滚去...Scroller相关类使用大揭秘!!!

2016-07-21 17:14 381 查看
完善【凯子哥带你夯实应用层】滚来滚去,滚来滚去…Scroller相关类使用大揭秘!!! 的JellyTextView

效果图


凯子哥之所以会向y轴靠,正是因为这个方法中

未做任何判断直接调用这两个方法

mScrollerX.springback

mScrollerY.springback

在这个方法中有这样一个判断

if (start < min) {
startSpringback(start, min, 0);
} else if (start > max) {
startSpringback(start, max, 0);
}


很明显要么小于min,要么大于max,根本没有考虑其他情况保持原来的值

public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) {
mMode = FLING_MODE;

// Make sure both methods are called.
final boolean spingbackX = mScrollerX.springback(startX, minX, maxX);
final boolean spingbackY = mScrollerY.springback(startY, minY, maxY);
return spingbackX || spingbackY;
}

boolean springback(int start, int min, int max) {
mFinished = true;

mStart = mFinal = start;
mVelocity = 0;

mStartTime = AnimationUtils.currentAnimationTimeMillis();
mDuration = 0;

if (start < min) {
startSpringback(start, min, 0);
} else if (start > max) {
startSpringback(start, max, 0);
}

return !mFinished;
}


我改写后的

package com.socks.scrollerdemo;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.BounceInterpolator;
import android.widget.OverScroller;
import android.widget.TextView;

/**
* Created by zhaokaiqiang on 15/2/28.
*/
public class JellyTextView extends TextView {

private OverScroller mScroller;

private float lastX;
private float lastY;

private float startX;
private float startY;
private int width;
private int height;

public JellyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mScroller = new OverScroller(context, new BounceInterpolator());
}

@Override
public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
lastY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
if (!mScroller.isFinished())
mScroller.forceFinished(true);
float disX = event.getRawX() - lastX;
float disY = event.getRawY() - lastY;

offsetLeftAndRight((int) disX);
offsetTopAndBottom((int) disY);
lastX = event.getRawX();
lastY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
//              mScroller.startScroll((int) getX(), (int) getY(), -(int) (getX() - startX),
//                      -(int) (getY() - startY));
//              invalidate();
int minX = 0;
int maxX = width - getWidth();
int minY = 0;
int maxY = height - getHeight();
if (getX() <= 0 && getY() < 0) {
} else if (getX() < 0) {
if (getY() > height - getHeight()) {

} else {
minY = (int) getY() + 1;

}
} else if (getY() < 0) {
minX = (int) getX() + 1;
}

if (getX() > width - getWidth() && getY() > height - getHeight()) {
} else <
4000
span class="hljs-keyword">if (getX() > width - getWidth()) {
if (getY() < 0) {
minX= 0;
} else {
maxY = (int) getY() - 1;

}
} else if (getY() > height - getHeight()) {
maxX = (int) getX() - 1;
}
mScroller.springBack((int) getX(), (int) getY(), minX, maxX, minY,
maxY);
invalidate();
break;
}

return super.onTouchEvent(event);
}

@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
setX(mScroller.getCurrX());
setY(mScroller.getCurrY());
invalidate();
}

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
startX = getX();
startY = getY();
View v = (View) getParent();
width = v.getWidth();
height = v.getHeight();
}

public void spingBack() {

if (mScroller.springBack((int) getX(), (int) getY(), 100, 1000, 100,
1000)) {
Log.d("TAG", "getX()=" + getX() + "__getY()=" + getY());
invalidate();
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android