簡體   English   中英

具有縮放功能的Android上的CustomView不起作用

[英]CustomView on Android with Scaling not working

我正在嘗試創建一個具有縮放功能的自定義視圖,但在我的下面的代碼中未顯示任何內容。由於此處已請求此操作,這是我當前縮放位圖的方式,請注意,我在尋找另一種縮放整個畫布的方法。 這是我的onDraw()方法的細節,但是完整的方法在項目放置方面有更多的邏輯,在縮放之前,我檢查了一個布爾型標志(如果用戶選擇了縮放),但我認為您不想篩選那么多代碼,所以我只是把相關的東西放在這里。

private final int bgColor = 8355711;
private Paint paint;
private Bitmap bgBitmap;
private float scaleFactor = 1;
private final float minScaleFactor = 0.25f, maxScaleFactor = 10f;
private ScaleGestureDetector scaleDetector;

public OratorView(Context context) {
    super(context, null, 0);
//  init(context);
}

public OratorView(Context context, AttributeSet set) {
    super(context, set, 0);
    init(context);
}

public OratorView(Context context, AttributeSet set, int defStyle) {
    super(context, set, defStyle);
    init(context);
}

private void init(Context context) {
    if (null == scaleDetector)
        this.scaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    this.paint = new Paint();
    this.paint.setColor(bgColor);
}

public void setBackground(Bitmap bitmap) {
    this.bgBitmap = bitmap;
    bgScaled = false;
}

private boolean bgScaled = false;

private void scaleBg() {
    if (null != bgBitmap) {
        if (bgBitmap.getWidth() > 0 && bgBitmap.getHeight() > 0) {
            float widthFactor = (float) bgBitmap.getWidth() / (float) getWidth();
            float heightFactor = (float) bgBitmap.getHeight() / (float) getHeight();
            float scale = widthFactor > heightFactor ? widthFactor : heightFactor;
            bgBitmap = Bitmap.createScaledBitmap(bgBitmap, (int) (bgBitmap.getWidth() / scale), (int) (bgBitmap.getHeight() / scale),
                    true);
            bgScaled = true;
        }
        invalidate();
    }
}

@Override
public void onDraw(Canvas c) {
    super.onDraw(c);
    c.save();
    c.scale(scaleFactor, scaleFactor);
    // fill background with solid color
    c.drawColor(bgColor);

    if (!bgScaled) {
        scaleBg();
    }
    // draw background image if any
    if (null != bgBitmap) {
        c.drawBitmap(bgBitmap, (getWidth() - bgBitmap.getWidth()) / 2, (getHeight() - bgBitmap.getHeight()) / 2, paint);
    }
    c.restore();
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    scaleDetector.onTouchEvent(ev);
    return true;
}

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        scaleFactor *= detector.getScaleFactor();
        Log.d("OratorView", "onScale - scaleFactor=" + scaleFactor);
        if (scaleFactor >= maxScaleFactor && scaleFactor <= maxScaleFactor) {
            scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 5.0f));
            invalidate();
        }
        return true;
    }
}

我相信問題出在您的ScaleListener.onScale方法內。 這是我正在談論的代碼塊:

 if (scaleFactor >= maxScaleFactor && scaleFactor <= maxScaleFactor) {
          scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 5.0f));
          invalidate();
 }

僅當scaleFactor == maxScaleFactor時,此條件才成立。 因為僅在滿足此條件的情況下才使視圖無效,所以只要不將scaleFactor設置為10f,就不會重繪視圖。

順便說一句,我不明白為什么您要將當前比例因子乘以所選比例因子。 我建議將此任務更改為:

scaleFactor = detector.getScaleFactor();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM