Improve detail scene

This commit is contained in:
seven332 committed 2015-07-02 01:21:07 +08:00
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();
}
}