Android PinView不在循环中绘制

Android PinView不在循环中绘制,android,Android,我扩展了SubsamplingScaleImageView以创建文档中推荐的PinView。我能在适当的地方画一品脱。 但我面临的问题是:当我试着画一个圈的时候,别针不见了。 我验证了在主线程上调用OnDraw 下面是我正在使用的代码 public class PinView extends SubsamplingScaleImageView { private PointF sPin; private Bitmap pin; private PointF sBlueD

我扩展了SubsamplingScaleImageView以创建文档中推荐的PinView。我能在适当的地方画一品脱。 但我面临的问题是:当我试着画一个圈的时候,别针不见了。 我验证了在主线程上调用OnDraw

下面是我正在使用的代码

public class PinView extends SubsamplingScaleImageView {

    private PointF sPin;
    private Bitmap pin;
    private PointF sBlueDot;
    private Bitmap blueDot;

    public PinView(Context context) {
        this(context, null);
    }

    public PinView(Context context, AttributeSet attr) {
        super(context,attr);
        initialise();
        initialiseBlueDot()
    }

    public void setPin(PointF sPin) {
        this.sPin = sPin;
        initialise();
        invalidate();
    }

    public void setBlueDot(PointF sPin) {
        this.sBlueDot = sPin;
        initialiseBlueDot();
        invalidate();
    }

    public PointF getPin() {
        return sPin;
    }

    private void initialise() {
        float density = getResources().getDisplayMetrics().densityDpi;
        pin = BitmapFactory.decodeResource(this.getResources(), drawable.pushpin_blue);
        float w = (density/420f) * pin.getWidth();
        float h = (density/420f) * pin.getHeight();
        pin = Bitmap.createScaledBitmap(pin, (int)w, (int)h, true);
    }

    private void initialiseBlueDot() {
        float density = getResources().getDisplayMetrics().densityDpi;
        blueDot = BitmapFactory.decodeResource(this.getResources(), drawable.pushpin_blue);
        float w = (density/420f) * blueDot.getWidth();
        float h = (density/420f) * blueDot.getHeight();
        blueDot = Bitmap.createScaledBitmap(blueDot, (int)w, (int)h, true);
    }  

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // Don't draw pin before image is ready so it doesn't move around during setup.
        if (!isReady()) {
            return;
        }

        Paint paint = new Paint();
        paint.setAntiAlias(true);

        if (sPin != null && pin != null) {
            PointF vPin = sourceToViewCoord(sPin);
            float vX = vPin.x - (pin.getWidth()/2);
            float vY = vPin.y - pin.getHeight();
            canvas.drawBitmap(pin, vX, vY, paint);
        }

        if (sBlueDot != null && pin != null) {
            PointF vPin = sourceToViewCoord(sBlueDot);
            float vX = vPin.x - (blueDot.getWidth()/2);
            float vY = vPin.y - blueDot.getHeight();
            canvas.drawBitmap(blueDot, vX, vY, paint);
        }
    }
}

我自己把它修好了。问题在于XY和源XY点。使用viewToSourceCoord()获取正确的位置点。

我自己修复了它。问题在于XY和源XY点。使用viewToSourceCoord()获取正确的位置点。

看起来每次调用onDraw(画布)时,都会将管脚的位置偏移宽度/2和高度。由于调用速度非常快,所以在您能够看到之前,图钉的位置已经移出画布的边界。@Guardanis我只是在那里定位x-y点,但即使我移除它,仍然无法看到图钉。抱歉,一定是瞎的。我想我看到了完全不同的事情。isReady()是否可能返回false?也许在它之前尝试记录,看看它是否通过了是的,我验证过了,isReady()总是返回true。看起来每次调用onDraw(Canvas)时,你都在按宽度/2和高度偏移管脚的位置。由于调用速度非常快,所以在您能够看到之前,图钉的位置已经移出画布的边界。@Guardanis我只是在那里定位x-y点,但即使我移除它,仍然无法看到图钉。抱歉,一定是瞎的。我想我看到了完全不同的事情。isReady()是否可能返回false?也许在它之前尝试记录,看看它是否通过了,是的,我验证过了,isReady()总是返回true。