Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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
Xamarin Android自定义图像渲染器Canvas.DrawBitmap翻转图像_Xamarin_Xamarin.android_Xamarin.forms_Custom Renderer - Fatal编程技术网

Xamarin Android自定义图像渲染器Canvas.DrawBitmap翻转图像

Xamarin Android自定义图像渲染器Canvas.DrawBitmap翻转图像,xamarin,xamarin.android,xamarin.forms,custom-renderer,Xamarin,Xamarin.android,Xamarin.forms,Custom Renderer,我有两个图像:一个是空罐子,另一个是同一个罐子,但有填充物。我的目标是使用自定义渲染器绘制空jar,计算百分比,然后将完整jar的一个子集复制到空jar上,以根据值响应地模拟jar填充。为此,我制作了一个自定义的ImageRenderer 我已重写Draw()类,如下所示: public override void Draw(Canvas canvas) { base.Draw(canvas); //Draw the fill GoalJ

我有两个图像:一个是空罐子,另一个是同一个罐子,但有填充物。我的目标是使用自定义渲染器绘制空jar,计算百分比,然后将完整jar的一个子集复制到空jar上,以根据值响应地模拟jar填充。为此,我制作了一个自定义的ImageRenderer

我已重写Draw()类,如下所示:

public override void Draw(Canvas canvas)
    {
        base.Draw(canvas);

        //Draw the fill
        GoalJarView handle = (GoalJarView)this.Element;
        int startY = (int)(canvas.Height - Math.Floor(canvas.Height * (handle.CurrentValue / handle.GoalValue)));
        Rect bounds = new Rect(0, startY, canvas.Width, canvas.Height); 
        Bitmap bmp = BitmapFactory.DecodeResource(this.Context.Resources, Resource.Drawable.jar_fill);
        canvas.DrawBitmap(bmp, bounds, bounds, null);
    }
出于某种原因,这会导致绘制正确的图像,但无论出于何种原因,图像都会颠倒并位于错误的位置:

奇怪的是,如果我将src矩形更改为null,它会显示在正确的位置,右侧向上,但不会被裁剪

canvas.DrawBitmap(bmp, null, bounds, null);


为什么Android会翻转这个图像

您必须考虑到您的
可绘制
视图
的画布大小不同(假设您使用的是
图像视图
子类),您必须将位图缩放到视图的画布上,因此您的
src
dst
矩形不相同

以下是一个例子:

protected override void OnDraw(Canvas canvas)
{
    base.OnDraw(canvas);
    if ((Current > Max) || (Current <= 0.0)) return;
    var percentComplete = Current / Max;
    var overlayYFrom = (int)(overlayBitmap.Height - (overlayBitmap.Height * percentComplete));
    var overlayYTo = (int)(canvas.Height - (canvas.Height * percentComplete));
    var drawRectFrom = new Rect(0, overlayYFrom, overlayBitmap.Width, overlayBitmap.Height);
    var drawRectTo = new Rect(0, overlayYTo, canvas.Width, canvas.Height);
    canvas.DrawBitmap(overlayBitmap, drawRectFrom, drawRectTo, null);
}
protectedoverride void OnDraw(画布)
{
底座.OnDraw(帆布);
如果((当前>最大)| |(当前)