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) {

            }
        }
    }

画面は以下のようにキャンバスに完全に描画されます:-

4

4 に答える 4

2

canvas.clipRect(rectangle) で簡単に実行できます。この時点で、キャンバス canvas.save() を保存し、canvas.clipRect(rectangle) の後に canvas.restore() を呼び出します。

于 2012-09-25T13:30:32.987 に答える
1

次のようなことを試すことを検討してください。

  • 拡大したいキャンバスからビットマップを作成します。
  • そのビットマップを画面にレンダリングするときに、scr rect を変更できます (ビットマップに「ズーム」します)。

これが役立つことを願っています。

于 2012-08-09T13:51:50.643 に答える
0

ゲームボードをオフスクリーンビットマップにレンダリングしてから、を使用してこのビットマップをキャンバスに描画する必要があると思います。これMatrixにより、その位置とスケールを変更できるようになります。

于 2012-07-30T12:06:07.367 に答える
0

これを行う最も簡単な方法は、Canvas#scale(float scale, int pivotx, int pivoty)メソッドを使用することだと思います。基本的に、キャンバス全体を均一に拡大します。これは、2D の視点から見たズームです。

canvas.scale(2.0f, getWidth()/2, getHeight()/2)画像を中心から 2 倍にスケーリングします。 canvas.scale(1.0f, getWidth()/2, getHeight()/2)縮小します。

この文脈でこれを試したことがないので、試してみることにした場合は、結果を報告してください! 今後の参考にさせていただきたいと思います。

于 2012-08-09T14:01:29.587 に答える