آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

Zoom out در CanvasView (حل شد)

Russel  6 سال پیش  6 سال پیش
0 0

سلام

من یه CanvasView  دارم که برای رسم چند نمودار هست و برای بهتر دیده شدن نمودارها zoom و scroll هم میشه انجام داد . مشکل اینجاست که وقتی zoom out می کنم میخوام تصویر align center بشه اما نمی دونم چطوری! کسی از دوستان میتونه راهنماییم کنه ؟

کد CanvasView منهای قسمتهای ترسیم خط و خطوط  اینه : 

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.widget.ImageView;

class CanvasBar extends ImageView {

private ScaleGestureDetector mScaleDetector;
private float mScaleFactor = 1.f;
private GestureDetector mGestureDetector;
private float mBoardScale = 2f;
private float mBoardScrollX = 0f;
private float mBoardScrollY = 0f;
public CanvasBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initilize();
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
mGestureDetector = new GestureDetector(context, new GestureListener());
}

public CanvasBar(Context context, AttributeSet attrs) {
super(context, attrs);
initilize();
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
mGestureDetector = new GestureDetector(context, new GestureListener());
}

public CanvasBar(Context context) {
super(context);
initilize();
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
mGestureDetector = new GestureDetector(context, new GestureListener());
}
public void initilize(){
.
.
.
.
.
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w,h,oldw,oldh);
height = getHeight();
width = getWidth();
mBoardScale = Math.max(w / width, h / height);

float minScrollX = w - mBoardScale * width;
float minScrollY = h - mBoardScale * height;

mBoardScrollX = minScrollX / 2;
mBoardScrollY = minScrollY / 2;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
mScaleDetector.onTouchEvent(ev);
mGestureDetector.onTouchEvent(ev);

return true;
}


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

canvas.save();
canvas.scale(mScaleFactor, mScaleFactor);
canvas.translate(mBoardScrollX / mBoardScale, mBoardScrollY / mBoardScale);
.
.
.
.
.
    canvas.restore();
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, 5.0f));
postInvalidate();
return true;
}
}

private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float dX, float dY) {
mBoardScrollX -= dX;
mBoardScrollY -= dY;
postInvalidate();
return true;
}
}
}

 

 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
Russel  6 سال پیش
+1 0

خوب دوستان کسی جواب نداد ، بالاخره خودم حلش کردم

کافیه این چند خط رو به متد onTouchEvent اضافه کنیم 

@Override
public boolean onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);
mGestureDetector.onTouchEvent(ev);
if(mScaleFactor<=1.0f){
mBoardScale = 2f;
mScaleFactor = 1.0f;
mBoardScrollX = 0f;
mBoardScrollY = 0f;
postInvalidate();
}
return true;
}

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .