بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
Zoom out در CanvasView (حل شد)
سلام
من یه 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;
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .