Android Canvas.drawBitmap对所有调用使用位图的最后一个内容

Android Canvas.drawBitmap对所有调用使用位图的最后一个内容,android,xamarin,canvas,bitmap,drawbitmap,Android,Xamarin,Canvas,Bitmap,Drawbitmap,我试图在Xamarin中的自定义视图上呈现多个PDF页面 public override void Draw( AG.Canvas canvas ) { base.Draw( canvas ); if( !(Parent is AW.ScrollView p) || pdfRenderer == null ) return; int topPage = pdfRenderer.PageCount * p.Scroll

我试图在Xamarin中的自定义视图上呈现多个PDF页面

    public override void Draw( AG.Canvas canvas ) {
        base.Draw( canvas );
        if( !(Parent is AW.ScrollView p) || pdfRenderer == null )
            return;
        int topPage = pdfRenderer.PageCount * p.ScrollY / Height;
        while( topPage < pdfRenderer.PageCount && topPage * screenPageHeight < p.ScrollY + p.Height ) {
            using( var page = pdfRenderer.OpenPage( topPage ) ) {
                page.Render( bitmap, null, null, PdfRenderMode.ForDisplay );
                page.Close();
            }
            AG.Rect pageRect = new AG.Rect {
                Left = 0,
                Top = topPage * screenPageHeight,
                Right = Width,
                Bottom = (topPage + 1) * screenPageHeight,
            };
            canvas.DrawBitmap( bitmap, null, pageRect, null );
            topPage++;
        }
    }

David和我相信这与使用画布从同一资源加载可绘制对象有关。位图是可绘制的。Xamarin是API上非常薄的一层包装,因此这可能与Xamarin无关,但更具体地说是Android。请注意文档的这一部分: 注意:无论您为项目实例化了多少不同的对象,项目中的每个唯一资源都只能维护一种状态。例如,如果从同一图像资源实例化两个可绘制对象,并更改一个对象的属性(如alpha),则它也会影响另一个对象。在处理图像资源的多个实例时,不应直接变换可绘制对象,而应执行tween动画。 - - 因此,最可能的原因是您正在从同一资源(pdf)创建位图实例。我无法在您的代码片段中确认这一点,但这是最有可能的原因。 这也可能与重复使用同一个位图实例有关,而不是多个单独的位图实例,但我在代码段中也看不到这一点。与前面提到的画布上可绘制的问题相比,这可能不是问题的原因。检查tween动画是否对您的场景有帮助

不过请注意,可能有更简化的方法来呈现PDF。Android(和Xamarin.Andriod)为PdfRenderer提供了API。Android的文档在这里:Xamarin.Android,我们这里有Xamarin包装器的API文档:
或者,您也可以在Xamarin.Android或Xamarin.Forms中将source属性设置为Xamarin.Forms.WebView中的pdf,或者从Android.Webkit.WebView的实例调用LoadUrl,将pdf设置为Xamarin.Android或Xamarin.Forms中的WebView的源文件。

我应该看到什么?附上两张截图,这是Visua;Studio2017A bmp只能这么大。根据PDF的大小,如果不将其严重缩小到难以辨认的程度,这可能是不可能的。我可以问一下,让它不产生多个bmp的目标是什么?这是因为资源限制吗?或者你只是喜欢一个文件?您是否可以继续生成多个bmp并将它们缝合到另一种格式?或者你是在试图阻止一开始就有多个bmp?添加了简单的java代码来重现这个问题。你说的Canvas.Render是什么意思?我在你链接到的页面上没有看到它的任何参考。每次迭代都会调用DrawBitmap。我没有多个位图,只有一个。我在内存中创建它,而不是从资源中创建。代码片段显示了我如何将pdf呈现到其中。为此,您可能需要使用位图列表。当您告诉画布显示位图时,它不会立即这样做。它告诉画布,下次你画的时候,画这个。当画布最终渲染时,它渲染位图的当前值。我还需要一个样品来确认;我看不到您的一些值是在哪里初始化的,也看不到如何调用Draw的上下文。您是否可以共享一个项目(或创建项目的说明),以方便地重现该问题。Jordan试图复制这个,但它没有为她复制,因此我们需要更广泛的示例。
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new TestView());
    }

    class TestView extends View {
        public TestView() {
            super(MainActivity.this);
        }

        Bitmap bmp = Bitmap.createBitmap(600, 200, Bitmap.Config.ARGB_8888);
        Paint paint = new Paint();

        void FillBitmap(int color) {
            Canvas canvas = new Canvas(bmp);
            canvas.drawColor(color);
        }

        protected void onDraw (Canvas canvas) {
            FillBitmap(Color.RED);
            canvas.drawBitmap(bmp, 60, 120, paint);
            FillBitmap(Color.GREEN);
            canvas.drawBitmap(bmp, 60, 440, paint);
        }

        protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(720, 720);
        }
    }
}