下面列出了android.graphics.PointF#length ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public boolean onTouchEvent(MotionEvent evt) {
switch (evt.getAction()) {
case MotionEvent.ACTION_DOWN:
// 记录按下时候的坐标
downPoint.x = evt.getX();
downPoint.y = evt.getY();
if (this.getChildCount() > 1) {
//有内容,多于1个时
// 通知其父控件,现在进行的是本控件的操作,不允许拦截
getParent().requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_MOVE:
if (this.getChildCount() > 1) {
//有内容,多于1个时
// 通知其父控件,现在进行的是本控件的操作,不允许拦截
getParent().requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
// 在up时判断是否按下和松手的坐标为一个点
if (PointF.length(evt.getX() - downPoint.x, evt.getY() - downPoint.y) < (float) 5.0) {
onSingleTouch(this);
return true;
}
break;
default:
break;
}
return super.onTouchEvent(evt);
}
/**
* Handles the touch events that shows the workspace when clicking outside the bounds of the
* touch delegate target view.
*/
private boolean handleTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// Check if the touch is outside touch delegate target view
View touchDelegateTargetView = getTouchDelegateTargetView();
float leftBoundPx = touchDelegateTargetView.getLeft();
if (ev.getX() < leftBoundPx ||
ev.getX() > (touchDelegateTargetView.getWidth() + leftBoundPx)) {
mLastTouchDownPosPx.set((int) ev.getX(), (int) ev.getY());
}
break;
case MotionEvent.ACTION_UP:
if (mLastTouchDownPosPx.x > -1) {
ViewConfiguration viewConfig = ViewConfiguration.get(getContext());
float dx = ev.getX() - mLastTouchDownPosPx.x;
float dy = ev.getY() - mLastTouchDownPosPx.y;
float distance = PointF.length(dx, dy);
if (distance < viewConfig.getScaledTouchSlop()) {
// The background was clicked, so just go home
Launcher.getLauncher(getContext()).showWorkspace(true);
return true;
}
}
// Fall through
case MotionEvent.ACTION_CANCEL:
mLastTouchDownPosPx.set(-1, -1);
break;
}
return false;
}
static Path createPath(PointF startPoint, PointF endPoint, PointF cp1, PointF cp2) {
Path path = new Path();
path.moveTo(startPoint.x, startPoint.y);
if (cp1 != null && cp1.length() != 0 && cp2 != null && cp2.length() != 0) {
path.cubicTo(
startPoint.x + cp1.x, startPoint.y + cp1.y,
endPoint.x + cp2.x, endPoint.y + cp2.y,
endPoint.x, endPoint.y);
} else {
path.lineTo(endPoint.x, endPoint.y);
}
return path;
}
public static Path createPath(PointF startPoint, PointF endPoint, PointF cp1, PointF cp2) {
Path path = new Path();
path.moveTo(startPoint.x, startPoint.y);
if (cp1 != null && cp2 != null && (cp1.length() != 0 || cp2.length() != 0)) {
path.cubicTo(
startPoint.x + cp1.x, startPoint.y + cp1.y,
endPoint.x + cp2.x, endPoint.y + cp2.y,
endPoint.x, endPoint.y);
} else {
path.lineTo(endPoint.x, endPoint.y);
}
return path;
}
/** Calculates the distance between the 2 current pointers */
private float distance(MotionEvent event) {
if (event.getPointerCount() < 2) {
return 0;
}
return PointF.length(event.getX(POINTER1) - event.getX(POINTER2), //
event.getY(POINTER1) - event.getY(POINTER2));
}
private float xyToDegrees(float x, float y) {
float distanceFromCenter = PointF.length((x - 0.5f), (y - 0.5f));
if (distanceFromCenter < 0.15f
|| distanceFromCenter > 0.5f) { // ignore center and out of bounds events
return Float.NaN;
} else {
return (float) Math.toDegrees(Math.atan2(x - 0.5f, y - 0.5f));
}
}
private void normalizeVector(PointF point) {
final float abs = point.length();
point.set(point.x / abs, point.y / abs);
}
public boolean satisfyMoveDismissCondition(MotionEvent event) {
return PointF.length(event.getRawX() - mDownPointF.x, event.getRawY() - mDownPointF.y) > mMoveHiddenThreshold;
}
private void normalizeVector(PointF point) {
final float abs = point.length();
point.set(point.x / abs, point.y / abs);
}
/**
* Test if a MotionEvent with the given start and end offsets
* can be considered as a "click".
* @param upEvent The final finger-up event.
* @param xDown The x-offset of the down event.
* @param yDown The y-offset of the down event.
* @param xUp The x-offset of the up event.
* @param yUp The y-offset of the up event.
* @return true if it's a click, false otherwise
*/
private boolean isClick(MotionEvent upEvent, float xDown, float yDown, float xUp, float yUp) {
if (upEvent == null) return false;
long time = upEvent.getEventTime() - upEvent.getDownTime();
float distance = PointF.length( //
xDown - xUp, //
yDown - yUp);
return time < MAX_CLICK_TIME && distance < MAX_CLICK_DISTANCE;
}
/**
* Get the euclidean distance between two points
*
* @param firstPoint PointF object
* @param secondPoint PointF object
* @return float value representing the distance in a straight line between two points
*/
public static float euclideanDistance(PointF firstPoint, PointF secondPoint) {
return PointF.length(secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y);
}