部分缩放画布

4

我希望能够部分缩放画布板,因为字母托盘按钮将被固定,而画板将被缩放。
部分缩放的代码如下所示,屏幕完全绘制在画布上,可以在底部查看。请帮忙,感谢您的关注。

        public class BoardView extends SurfaceView implements SurfaceHolder.Callback
                {
        class DrawingThread extends Thread implements OnTouchListener {

        public DrawingThread(SurfaceHolder holder, Handler handler) {
                    mSurfaceHolder = holder;

        public void setRunning(boolean b) {
                    mRun = b;
                }

                @Override
                public void run() {
                    while (mRun) {
                        Canvas c = null;
                        try {
                            c = mSurfaceHolder.lockCanvas(null);

        synchronized (mSurfaceHolder) {
                                // System.gc();
                                // c.scale(canvasScaleX, canvasScaleY);
                                // c.save();
                                // c.translate(canvasTranslateX, canvasTranslateY);
                                doDraw(c);
                            }

                            updateGame();
                        } finally {
                            if (c != null) {
                                mSurfaceHolder.unlockCanvasAndPost(c);
                            }
                        }
        }

        private void doDraw(Canvas canvas) {
                    if (ge == null)
                        return;

                        Rect bRect = new Rect(0, 0, dims.getTotalWidth(),
                        dims.getScoreHeight() + dims.getBoardheight());
                Drawable drawable = getResources().getDrawable(R.drawable.board);
                drawable.setBounds(bRect);

                drawable.draw(canvas);

                Rect tRect = new Rect(0, dims.getScoreHeight()
                        + dims.getBoardheight(), dims.getTotalWidth(),
                        dims.getTotalHeight());
                canvas.drawRect(tRect, fillTrayPaint);

                int topHeight = dims.getScoreHeight() + dims.getBoardheight();
                int bottom = (dims.getTotalHeight() + 5)
                        - (dims.getTotalWidth() / Tray.TRAY_SIZE);
                Rect rect = new Rect(0, topHeight, dims.getTotalWidth(), bottom - 7);
                Drawable drawableTray = getResources()
                        .getDrawable(R.drawable.strip);
                drawableTray.setBounds(rect);
                drawableTray.draw(canvas);
                        drawTray(canvas);
                drawBoard(canvas);

                // drawScore(canvas);
                drawMovingTile(canvas);
            }


public BoardView(Context context, AttributeSet attrs) {
        super(context, attrs);

        SurfaceHolder holder = getHolder();
        holder.addCallback(this);

        // endTurn=(ImageButton)findViewById(R.id.endturn_button_horizontal);
        thread = new DrawingThread(holder, handler);
    }
@Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        final float scale1 = getResources().getDisplayMetrics().density;
        defaultFontSize = (int) (MIN_FONT_DIPS * scale1 + 0.5f);
        thread.setDefaultFontSize(defaultFontSize);
        dimensions = calculateDimensions(getWidth(), getHeight());
        thread.setDimensions(dimensions);

        thread.setRunning(true);

        // if (thread != null && !thread.isAlive())
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        thread.setRunning(false);
        while (retry) {
            try {
                thread.join();
                retry = false;
            } catch (InterruptedException e) {

            }
        }
    }

The screen is fully draw in canvas which is mention as below :-


1
我已经成功地实现了它...太好了...我们可以通过canvas.clipRect(rectangle)简单地完成它,此时我们应该保存画布canvas.save(),在canvas.clipRect(rectangle)调用后调用canvas.restore()。 - kamal_tech_view
4个回答

2
我们可以通过canvas.clipRect(rectangle)来实现,此时我们需要保存画布canvas.save(),在调用canvas.clipRect(rectangle)后再恢复画布canvas.restore()。

1
考虑尝试以下方法:
  • 从您想要缩放的画布中创建位图。
  • 在将该位图渲染到屏幕上时,您可以更改scr rect(这将“缩放”到位图)。
希望这能有所帮助。

你能提供一些关于在画布中放大和缩小可绘制对象的示例代码吗? - micky

0

我认为你需要将游戏板渲染成离屏位图,然后使用Matrix在画布上绘制该位图,这样你就可以改变它的位置和缩放。


我认为这不是正确的方式,因为同步拖放字母的托盘也应相应地展开。 - kamal_tech_view

0

我认为最简单的方法是使用Canvas#scale(float scale, int pivotx, int pivoty)方法。它可以均匀地扩大整个画布,这实际上就是从二维角度来看的缩放。

canvas.scale(2.0f, getWidth()/2, getHeight()/2)将从中心将图像缩放2倍。canvas.scale(1.0f, getWidth()/2, getHeight()/2)将使其缩小回来。

我从未在这种情况下尝试过这种方法,所以如果您决定尝试,请报告结果!我想了解以备将来参考。


好的,这是关于画布的全面缩放...那么部分缩放呢,有可能吗? - kamal_tech_view
“部分缩放”是什么意思?是指画布的一部分进行缩放吗? - Gautam
1
如果你想要一种放大镜式的缩放效果……我不太清楚他们是怎么做到的。如果我猜的话,你可以将你的画布转换成位图(就像其他人所说的那样),将其放置在另一个视图中,该视图覆盖在游戏板上,然后进行缩放和平移。你可能还可以使用clipRect来剪切你想要缩放的区域,然后使用scaleclipRect可以防止在某个特定区域周围绘制,但如果在调用它之前绘制了棋盘,则棋盘仍将显示。任何其他绘图都将在边界内剪裁。 - DeeV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接