0

我有一个画布/表面视图,我正在绘制多个位图,以便用户能够在画布上拖动和定位任何位置。我正在寻找一种方法来创建一个放大和缩小按钮,该按钮在选择时切换画布的 50% 缩放比例。

我的应用程序使用 onDraw() 方法将多个位图绘制到画布上。

我现在有一个功能,可以在切换缩放按钮时缩放每个单独的位图,但问题是让位图在缩放后相对于彼此对齐。我目前让它们缩小了它们的结束 x/y 位置,但是通过减小 50% 的大小,曾经彼此靠近的项目在缩小时不再那样。我希望有一个解决方案可以让我一次用整个画布完成这个任务。

如果我需要分享一些代码,请告诉我。

所有绘图发生的 SurfaceView 类

public class BuildView extends SurfaceView implements SurfaceHolder.Callback {

然后非缩放绘图发生为canvas.drawBitmap(myBitmap,x,y,null);

这是我的oncreate方法,注意BuildView gameView;正在开始我的surfaceview课程;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set full screen view
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN);
     requestWindowFeature(Window.FEATURE_NO_TITLE);

     FrameLayout Game = new FrameLayout(this);
     LinearLayout GameWidgets = new LinearLayout (this);
     gameview = new BuildView(this, null);         
     //create buttons to lay over the surfaceview
     Button AddItemButton = new Button(this);
     //Button ZoomInButton = new Button(this);
     zoomButton = new Button(this);
     TextView MyText = new TextView(this);
     AddItemButton.setWidth(250);
     AddItemButton.setText("Add Item");
     AddItemButton.setId(1);
     AddItemButton.setOnClickListener(addItemHandler);
     MyText.setText("test");
     zoomButton.setWidth(250);
     zoomButton.setText("Zoom Out");
     zoomButton.setId(2);
     zoomButton.setOnClickListener(zoomHandler);
     // adding views to the main Game framelayout view * note the view "gameview" is the surface view that everything happens on
     GameWidgets.addView(AddItemButton); 
     GameWidgets.addView(zoomButton);
     Game.addView(gameview);
     Game.addView(GameWidgets); 

    int w=getWindowManager().getDefaultDisplay().getWidth()-25;
    int h=getWindowManager().getDefaultDisplay().getHeight()-25;
    gameview.wid = w; //set width and height in view
    gameview.hei = h;
    gameview.setWidthHeight(w, h);
    setContentView(Game); //trying this out
    gameview.updateImage(0, 0); //force bg change
    Log.i("views", "Added Game View");
    //setContentView(v);
}

因为这里已经要求我当前如何缩放位图,请注意我正在寻找另一种缩放整个画布的方法。这是我的 onDraw() 方法的细节,但完整的方法在项目放置方面有更多逻辑,在缩放之前,如果用户选择缩放,我会检查一个布尔标志,但我认为你不想筛选那么多代码所以我只是把相关的东西放在这里。

protected void onDraw(Canvas canvas) { 
  float scaleHeight = getScaled(myBitmap.getHeight());
  float scaleWidth = getScaled(myBitmap.getWidth());                        

  scaler.postTranslate(-myBitmap.getWidth() / 4, -itemBit.getHeight() / 4); // Centers image
  scaler.postScale(scaleWidth, scaleHeight);
  Log.e("onDraw", "item not placed - scaler.postTranslate being called");
  scaler.postTranslate(itemX+myBitmap.getWidth()/2, itemY+myBitmap.getHeight()/2);
  canvas.drawBitmap(myBitmap, scaler, null);
}

这是我的 getScaled 函数;

    float getScaled(int orig) {
    //return a scaled version
    int newScale = orig /2;
        float scaled = ((float) newScale) / orig;                           
    return scaled;
}
4

0 回答 0