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