java - 使用Seek Bar缩放android Canvas

标签 java android canvas zooming android-seekbar

这是我在 stackoverflow 上的第一个问题。任何帮助将非常感激。 我正在尝试使用搜索栏缩放 Canvas ,因此根据搜索栏的进度, Canvas 将放大和缩小。

这是我在主要 Activity 中的代码:

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    // TODO Auto-generated method stub
    Toast.makeText(MainActivity.this, "Seekbar Value : " + progress, Toast.LENGTH_SHORT).show();
    CPaintView paint  =  (CPaintView) this.findViewById(R.id.cPaintView1);

    paint.zoomX = (float)progress;
    paint.zoomY = (float)progress;
    paint.invalidate();
}

然后它将进度值传递给包含 Canvas 的 CPaintView 类:

public class CPaintView extends View implements OnTouchListener {

    final Paint paint = new Paint();
    int color = Color.parseColor("#FF0000");

    Bitmap offScreenBitmap;
    Canvas offScreenCanvas;

    final int CIRCLE = 0;
    final int TRIANGLE = 1;
    final int SQUARE = 2;
    int shape = CIRCLE;
    private int mActivePointerId;
    float zoomX = 0;
    float zoomY = 0;

    public CPaintView(Context context) {
        super(context);

        setup();
    }

    public CPaintView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        setup();
    }

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

        setup();
    }

    public void setup()
    {
        setOnTouchListener(this); // define event listener and start intercepting events 
    }


    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        // draw the off screen bitmap
        if(zoomX > 0)
        {
            canvas.save();
            canvas.scale(zoomX, zoomY);
            canvas.drawBitmap(offScreenBitmap, 0, 0, paint);
            canvas.restore();
        }
        else
            canvas.drawBitmap(offScreenBitmap, 0, 0, paint);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // get the x,y coordinates of the MotionEvent.ACTION_MOVE event

        int pointerIndex = 0;
        for(int i = 0; i < event.getPointerCount(); i++)
        {
            mActivePointerId = event.getPointerId(i);
            pointerIndex = event.findPointerIndex(mActivePointerId);
            float x = event.getX(pointerIndex);
            float y = event.getY(pointerIndex);

            float y1 = y + 20;
            float x2 = x + 20;
            float y2 = y1 - 10;
            paint.setColor(color);

            float verts[] = {x, y, x, y1, x2, y2};
            int[] vertsColors = {color, color, color, color, color, color};


            switch(shape)
            {
                case CIRCLE:
                    offScreenCanvas.drawCircle(x, y, 10, paint); break;// draw a red circle at the x,y coordinates specified by the user
                case TRIANGLE:
                    offScreenCanvas.drawVertices(Canvas.VertexMode.TRIANGLES, verts.length, verts, 0, null, 0, vertsColors, 0, null, 0, 0, paint);break;
                case SQUARE:
                    offScreenCanvas.drawRect(x-10, y-10, x+10, y+10, paint); break; 
            }

            invalidate();
        }
                return true;
    }


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        // create / re-create the off screen bitmap to capture the state of our drawing
        // this operation will reset the user's drawing
            offScreenBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            offScreenCanvas = new Canvas(offScreenBitmap);
    }
}

我在使用 onDraw 方法时遇到问题。问题是,当我增加搜索栏进度时,整个 Canvas 消失,我尝试在其上绘制,似乎它没有绘制。但是当我将搜索栏进度减回到 0 时,所有绘图都会回来,我可以再次看到它,包括看起来不起作用的绘图。

我很抱歉我的英语不好。

非常感谢。

最佳答案

您的问题是关于规模如何运作的概念性问题。 0,0 处的缩放比例未定义。默认缩放比例为 1f,1f。缩放根本不起作用,

 if(zoomX > 0)
        {
            canvas.save();
            canvas.scale(zoomX, zoomY);
            canvas.drawBitmap(offScreenBitmap, 0, 0, paint);
            canvas.restore();
        }
        else
            canvas.drawBitmap(offScreenBitmap, 0, 0, paint);

如果缩放为0,那么它将正确绘制缩放后的位图。因为它会跳过您的缩放步骤。否则,您的缩放比例约为 50,这基本上可能会使位图成为一个点。尝试让缩放悬停在 1 左右。类似缩放 = 12/(1 + 进度) 那么缩放范围可以从 12 倍到小于零的值。你的画看起来应该在那里,只是WAAAAY小。除了在零时跳过该步骤并将其设为 1 之外。

关于java - 使用Seek Bar缩放android Canvas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25548442/

相关文章:

android - 如何在android中的autocompletetextview中获取所选项目的ID

android - SIP 注册监听器未触发

html - 创建 div 100% 圆形

javascript - 使用 Canvas 进行像素完美的 2D 鼠标拾取

javascript - Canvas 图像旋转、动态 Canvas 调整大小 - 图像被裁剪

java - 用户登录Domino后如何获取邮件nsf文件名

java - 找不到或加载主类java

java - Final 不允许我更改属性

Java - Apache Spark 通信

android - 如何在Flutter中渲染单个像素?