Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中创建可滚动和可缩放的画布?_Android_Canvas_Bitmap_Scroll_Zooming - Fatal编程技术网

如何在android中创建可滚动和可缩放的画布?

如何在android中创建可滚动和可缩放的画布?,android,canvas,bitmap,scroll,zooming,Android,Canvas,Bitmap,Scroll,Zooming,在过去的几周里,我一直在为自定义视图的缩放和滚动功能寻找合适的解决方案。在自定义视图中,我在onDraw()的画布上绘制位图,并在onSizeChanged()中创建新的位图和画布 我的代码片段如下: 在这个方法中,我调用drawBitmap()。这个方法从pagesProvider类中获取图像时间,pagesProvider类是我的自定义类 Bitmap backBitmap = pagesProvider.getPageBitmap(tile); src = new Rect(); dst

在过去的几周里,我一直在为自定义视图的缩放和滚动功能寻找合适的解决方案。在自定义视图中,我在onDraw()的画布上绘制位图,并在onSizeChanged()中创建新的位图和画布

我的代码片段如下:

在这个方法中,我调用drawBitmap()。这个方法从pagesProvider类中获取图像时间,pagesProvider类是我的自定义类

Bitmap backBitmap = pagesProvider.getPageBitmap(tile);
src = new Rect();
dst = new Rect(); 
@Override
public void onDraw(Canvas canvas) {

        drawBitmap(canvas, b, src, dst);
    }
这里是drawBitmap()此方法基于颜色模式在画布上绘制位图。这种颜色来自我的自定义选项类。我再次在画布上绘制位图,并在onSizeChanged()上创建mBitmap,在画布上绘制路径

private void drawBitmap(Canvas canvas, Bitmap backBitmap, Rect src, Rect dst) {

    if (colorMode != Options.COLOR_MODE_NORMAL) {

        paint.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(
                Options.getColorModeMatrix(this.colorMode))));
        canvas.drawBitmap(backBitmap, src, dst, paint);
    } else {
        canvas.drawBitmap(b, src, dst, null);
    }

    canvas.drawBitmap(mTopBitmap, 0, 0, mPaint); // mTopBitmap canvas is creating new bitmap on backBitmap bitmap canvas.
    canvas.drawPath(mPath, mPaint);

}
onSizeChanged():

如果我移除canvas.drawPath(mPath,mPaint);drawBitmap()画布中的行不是mTopBitmap画布上的绘制路径。如果我删除canvas.drawBitmap(mTopBitmap,0,0,mPaint);路径在backBitmap上绘制,但这些路径在润色时会重置

在OnTouchUp中,我调用mCanvas.drawPath(mPath,mPaint);用于在mTopBitmap上绘制新路径

我的问题是我想滚动我在mCanvas上绘制的mTopBitmap画布内容,并缩放mCanvas的mTopBitmap画布内容


我编写了缩放功能,并根据backBitmap大小添加了scroller。它工作正常。但我混淆了mTopBitmap画布如何将滚动和缩放放入mTop画布。

使用canvas.concat(矩阵)或canvas.translate/canvas.scale方法的组合我有一个库,可以满足您的需要,支持扩展的可缩放图像视图,例如随图像移动和缩放的绘图和覆盖。你可能不想放弃你所拥有的,但这可能是有用的。演示:代码:Hi@pskink这些方法在滚动时是如何有用的。我认为这些方法在缩放时是有用的。使用Canvas.translate()可以向任何方向移动画布,但是Canvas.concat比scale/translate组合更好
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    this.width = w;
    this.height = h;

    mTopBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mTopBitmap);

}