Improve detail scene
This commit is contained in:
1 parent
a01e43ea95
commit
3f6d3ea21c
47 files changed
+1647
-89
No files matched your search
@@ -17,6 +17,8 @@
|
||||
package com.hippo.scene;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Path;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
@@ -27,6 +29,12 @@ public class SceneView extends AbsoluteLayout {
|
||||
|
||||
private boolean mEnableTouch = true;
|
||||
|
||||
private Path mPath;
|
||||
private float mRadius;
|
||||
private float mCirclePercent = 1f;
|
||||
private float mStartX = -1f;
|
||||
private float mStartY = -1f;
|
||||
|
||||
public SceneView(Context context) {
|
||||
super(context);
|
||||
init();
|
||||
@@ -44,6 +52,7 @@ public class SceneView extends AbsoluteLayout {
|
||||
|
||||
private void init() {
|
||||
setClickable(true);
|
||||
mPath = new Path();
|
||||
}
|
||||
|
||||
public void setEnableTouch(boolean enableTouch) {
|
||||
@@ -64,4 +73,65 @@ public class SceneView extends AbsoluteLayout {
|
||||
public boolean dispatchGenericMotionEvent(@NonNull MotionEvent event) {
|
||||
return mEnableTouch && super.dispatchGenericMotionEvent(event);
|
||||
}
|
||||
|
||||
private void updateRadius() {
|
||||
int width = getWidth();
|
||||
int height = getHeight();
|
||||
if ((mStartX != -1f || mStartY != -1f) && width != 0 && height != 0) {
|
||||
float h = Math.max(mStartX, width - mStartX);
|
||||
float v = Math.max(mStartY, height - mStartY);
|
||||
mRadius = (float) Math.hypot(h, v);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t,
|
||||
int r, int b) {
|
||||
super.onLayout(changed, l, t, r, b);
|
||||
updateRadius();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(@NonNull Canvas canvas) {
|
||||
float circlePercent = mCirclePercent;
|
||||
int saved = 0;
|
||||
|
||||
if (circlePercent != 1f && mRadius != 0f) {
|
||||
mPath.rewind();
|
||||
mPath.addCircle(mStartX, mStartY, circlePercent * mRadius, Path.Direction.CW);
|
||||
saved = canvas.save();
|
||||
canvas.clipPath(mPath);
|
||||
}
|
||||
|
||||
super.draw(canvas);
|
||||
|
||||
if (circlePercent != 1f && mRadius != 0f && saved != 0) {
|
||||
canvas.restoreToCount(saved);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public void setCirclePercent(float circlePercent) {
|
||||
float largeCirclePercent = Math.max(mCirclePercent, circlePercent);
|
||||
mCirclePercent = circlePercent;
|
||||
|
||||
if (largeCirclePercent == 1f) {
|
||||
invalidate();
|
||||
} else {
|
||||
float radius = mRadius * largeCirclePercent;
|
||||
invalidate((int) (mStartX - radius), (int) (mStartY - radius),
|
||||
(int) (mStartX + radius), (int) (mStartY + radius));
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public float getCirclePercent() {
|
||||
return mCirclePercent;
|
||||
}
|
||||
|
||||
public void setStartPoint(float x, float y) {
|
||||
mStartX = x;
|
||||
mStartY = y;
|
||||
updateRadius();
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user