完善【凯子哥带你夯实应用层】滚来滚去,滚来滚去…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 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();
}
}
}