[英]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.