我有一个画布/表面视图,我正在绘制多个位图,以便用户能够在画布上拖动和定位任何位置。我正在寻找一种方法来创建一个放大和缩小按钮,该按钮在选择时切换画布的 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;
}