2017-05-13 9 views
0

私は空の瓶と瓶と同じですが、塗りつぶしの2つの画像があります。私の目標は、カスタムレンダラを使用して空のjarを描画し、パーセンテージの計算を行い、完全なjarのサブセットを空のものにコピーして、値に基づいてjarを応答してシミュレートすることです。これを行うには、カスタムImageRendererを作成しています。Xamarin AndroidカスタムイメージレンダラーCanvas.DrawBitmapフリッピングイメージ

私は次のようにドロー()クラスをオーバーライドしています

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); 
    } 

を何らかの理由で、これが描かれている正しい画像になりますが、何らかの理由でそれが上下逆さまにし、間違った場所にあります。

enter image description here

奇妙なことは、私がnullにSRC矩形を変更した場合、それが正しい場所、右サイドアップで表示しますが、トリミングされていない、です。

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

enter image description here

なぜAndroidのは、このイメージを反転さ?

答えて

0

あなたはあなたのビューのキャンバスにビットマップを拡張する必要があります(ImageViewサブクラスを使用していると仮定して)あなたのViewのキャンバスとしてあなたDrawableが同じサイズではありません考慮するのでごsrcdst長方形がされてい同じではありません。ここで

は一例です:

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); 
} 

注:お使いのベースイメージが全体のウィジェットを充填されていない場合は、部分的に他の上に描くように、あなたは、2枚の画像の不一致が表示されます。

注:BitmapFactory.DecodeResource重い API呼び出しであり、あなたはすべてのDrawサイクル、それを呼び出すのではなく、ビットマップをキャッシュする必要があります。 (メモリを最適化するために元のドロアブルのスケーリングされたバージョンをキャッシュすることができます)

関連する問題