Şu anda bir webview görüntüsünde (aşağıdaki fil) çizim fonksiyonu uygulamıyorum. Üzerinde çizim yapmakta bir sorunum yok, ancak zum fonksiyonu çizimde biraz korkak şeyler yapıyor (aşağıda 2. resim). Yakınlaştırdığımda, çizim yakınlaştırma yapmaz, tersine kaydırır. Yakınlaştırılmış çizim de çalışmıyor. Benim kod aşağıda:Kanvas - büyütme, kaydırma ve ölçekleme Android
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
canvas.scale(mScaleFactor, mScaleFactor);
canvas.restore();
clipBounds = canvas.getClipBounds();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mScaleDetector.onTouchEvent(event);
float touchX = event.getX()/mScaleFactor + clipBounds.left;
float touchY = event.getY()/mScaleFactor + clipBounds.top;
if (Deal.on)
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
break;
default:
return false;
}
else {
super.onTouchEvent(event);
}
invalidate();
return true;
}
public class ScaleGestureListener extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
invalidate();
return true;
}
}
Düzenleme: Ben GestureDetector en ölçek faktörünü kullanarak yakınlaştırma ile yeniden çizmek için tuval başardı. Ayrıca, çizimden yakınlaştırma/web görüntüleme denetimlerine geçiş yapan bir anahtarım var. Çalıştığım bir sorun, WebView'deki çift dokunmanın onScale jestini tetiklememesi. Bu, tuvalin yeniden çizilmediği ve yakınlaştırmada kaymadığı anlamına gelir.
Çift kademe yakınlaştırmanın ölçek faktöründen ne kadar etkilendiğini algılayan bir özelliği uygulamam gerekiyor. Eğer buna bir çözüm önerilebilirse . Güncelleştirme kodu:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
clipBounds = canvas.getClipBounds();
canvas.save();
drawPaint.setStrokeWidth(8/mScaleFactor);
canvas.scale(mScaleFactor, mScaleFactor, 0, 0);
canvas.drawPath(drawPath, drawPaint);
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.restore();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
pointerCount = event.getPointerCount();
mScaleDetector.onTouchEvent(event);
float touchX = (event.getX() + clipBounds.left)/mScaleFactor;
float touchY = (event.getY() + clipBounds.top)/mScaleFactor;
if (Deal.on){
if (event.getPointerCount() > 1){
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
break;
default:
return false;
}
}
else {
super.onTouchEvent(event);
}
invalidate();
return true;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Try for a width based on our minimum
int minw = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth();
int w = resolveSizeAndState(minw, widthMeasureSpec, 1);
//int minh = MeasureSpec.getSize(w) - (int)mTextWidth + getPaddingBottom() + getPaddingTop();
int h = resolveSizeAndState(MeasureSpec.getSize(w), heightMeasureSpec, 0);
setMeasuredDimension(w, h);
}
public class ScaleGestureListener extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
// Don't let the object get too small or too large.
if(Deal.on == false) {
mScaleFactor *= detector.getScaleFactor();
mScaleFactor = Math.max(1f, Math.min(mScaleFactor, 20.0f));
}
invalidate();
return true;
}
}
Eğer herhangi tuval çizim yapmadan önce ölçeğini yapmayı deneyin vermedi arasında yakınlaştırma sorumluluk tutmaya deneyebilir miyim? –
Ve soru nedir? Çizim neden ölçeklendirilmemiş veya neden çalışmaz? Açıkçası, çizimi her seferinde aynı boyayla yapıyorsunuz, bu yüzden neden yakınlaştırılmalı? – sandrstar
Neden hiç DoubleTap üzerinde zum yapıyorsunuz ve bu nerede uygulanmaktadır? Bunu yaparsanız scaleFactor'ı değiştirmelisiniz. –