读书人

图片热区点击之二(地界反弹,缩放,移动)

发布时间: 2014-01-03 00:30:09 作者: rapoo

图片热区点击之二(边界反弹,缩放,移动)

?部分关键性代码:

?a.对点击的区域进行判断,

/** * 反弹时的动画线程 */protected class MoveRunnable implements Runnable {//移动的步长private final static int MOVE_STEEP = 20;//移动的方向private float direct;//是X方向上的移动还是Y方向上的移动private boolean isMoveX;private float srcX, srcY, dstX, dstY;//一元一次方程private float a, b;public MoveRunnable(float srcX,  float srcY, float dstX, float dstY) {this.srcX = srcX;this.srcY = srcY;this.dstX = dstX;this.dstY = dstY;//求解A,Bif((dstY - srcY) != 0 && (dstX - srcX) != 0) {a = (dstY - srcY) / (dstX - srcX);b = dstY - a * dstX;}//以长的作为出发点isMoveX = Math.abs(srcX - dstX) > Math.abs(srcY - dstY);direct = isMoveX ? ((dstX - srcX) > 0 ? 1.0f : -1.0f) : ((dstY - srcY) > 0 ? 1.0f : -1.0f);isAnimation = true;}@Overridepublic void run() {float distanceX = 0;float distanceY = 0;boolean isEnd = false;if(isMoveX) {distanceX = direct * MOVE_STEEP;srcX += distanceX;if(direct > 0) {if(srcX >= dstX) {isEnd = true;srcX -= distanceX;distanceX = dstX - srcX;srcX = dstX;}}else {if(srcX <= dstX) {isEnd = true;srcX -= distanceX;distanceX = dstX - srcX;srcX = dstX;}}if(a == 0 && b == 0) {distanceY = 0;}else {float tempY = a * srcX + b;distanceY = tempY - srcY;srcY = tempY;}}else {distanceY = direct * MOVE_STEEP;srcY += distanceY;if(direct > 0 ) {if(srcY >= dstY) {isEnd = true;srcY -= distanceY;distanceY = dstY - srcY;srcY = dstY;}}else {if(srcY <= dstY) {isEnd = true;srcY -= distanceY;distanceY = dstY - srcY;srcY = dstY;}}if(a == 0 && b == 0 ) {distanceX = 0;}else {float tempX = (srcY - b) / a;distanceX = tempX - srcX;srcX = tempX;}}mViewHandler.obtainMessage(0, new Float[]{distanceX, distanceY}).sendToTarget();if(!isEnd) {mViewHandler.postDelayed(this, 10);}else {isAnimation = false;LogUtils.d(TAG, isAnimation + ", End!");}}}

??其它的一些代码在程序中均已经做过注释

?

读书人网 >移动开发

热点推荐