2016-07-22 23 views
0

Ich habe benutzerdefinierte ImageView implementiert. Da mein Bild groß ist, verwende ich ScrollView und HorizontalScrollView zum Bildlauf. Ich möchte einen Kreis im onTouch-Event zeichnen, aber es funktioniert nicht in allen Fällen. Wenn ich ein Bild scrolle und ein Touch-Ereignis feuere, gelten die x, y-Koordinaten für den aktuellen sichtbaren Bildausschnitt (in der oberen rechten Ecke ist es zB 0x0, aber wenn ich irgendwo scrolle und in der sichtbaren oberen Ecke auch 0x0), wird der Kreis gezeichnet nach Bildgröße. Ein weiteres Problem ist, dass App auf verschiedenen Bildschirmgrößen verwendet werden könnte. Ich weiß, dass es xamarin C#, aber in nativen Android sollte es gleich sein. Weiß jemand, wie man Koordinaten richtig zeichnet/bekommt?Get Touch-Koordinaten relativ zu einem benutzerdefinierten ImageView

public class DrawViewInside : ImageView 
{ 

    public static Bitmap bitmapInside; 
    private Paint paint = new Paint(); 
    private Point point = new Point(); 

    private Canvas mCanvas; 
    private static Bitmap mutableBitmap; 
    private Context mContext; 
    public static Bitmap b; 
    public void SetCarId(int id) 
    { 
     carId = id; 
    } 
    public DrawViewInside(Context context, IAttributeSet attrs) : base(context, attrs) 
    { 
     mContext = context; 
     setDefault(drawable); 
    } 

    public void SetBitmap(int drawableId) 
    { 
     setDefault(drawableId); 
     Invalidate(); 
    } 


    protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    { 
     base.OnMeasure(widthMeasureSpec, heightMeasureSpec); 

     int width = MeasureSpec.GetSize(widthMeasureSpec); 
     int height = width; 

     var metrics = Resources.DisplayMetrics; 
     if (b != null) 
     { 
      SetMeasuredDimension(b.Width, b.Height); 
     } 

    } 


    public async void setDefault(int drawableId) 
    { 


      BitmapFactory.Options options = await GetBitmapOptionsOfImage(drawableId); 
      paint.Color = Color.Red; 
      paint.StrokeWidth = 15; 
      paint.SetStyle(Paint.Style.Stroke); 
      var metrics = Resources.DisplayMetrics; 
      var widthInDp = ConvertPixelsToDp(metrics.WidthPixels); 
      var heightInDp = ConvertPixelsToDp(metrics.HeightPixels); 

      b = BitmapFactory.DecodeResource(Resources, drawableId);esources, drawableId); 
      mutableBitmap = b.Copy(Bitmap.Config.Argb8888, true); 
      mCanvas = new Canvas(mutableBitmap); 
      mCanvas.Save(); 

    } 


    protected override void OnDraw(Canvas canvas) 
    { 
     DrawCircle(canvas); 


    } 
    private void DrawCircle(Canvas canvas) 
    { 
     if (mCanvas == null) 
     { 
      setDefault(drawable); 
     } 
     else 
     { 
      mCanvas.Restore(); 
      mCanvas.DrawCircle(point.x, point.y, 10, paint); 
      mCanvas.Save(); 
      canvas.DrawBitmap(mutableBitmap, 0, 0, paint); 
      bitmapInside = mutableBitmap; 
     } 


    } 

    public override bool OnTouchEvent(MotionEvent e) 
    { 
     switch (e.Action) 
     { 
      case MotionEventActions.Down: 

       break; 

      case MotionEventActions.Up: 
         Activity act = (Activity)mContext; 

         float viewX = e.RawX - this.Left; 
         float viewY = e.RawY - this.Top; 
         point.x = viewX;// e.RawX; 
         point.y = viewY;// e.RawY; 

        break; 
       } 
     Invalidate(); 
     return true; 

    } 

} 
public class Point 
{ 
    public float x, y; 
} 

Antwort

0

Ich fand eine Lösung. Ersetzen Sie einfach

    float viewX = e.RawX - this.Left; 
        float viewY = e.RawY - this.Top; 
        point.x = viewX;// e.RawX; 
        point.y = viewY;// e.RawY; 

mit

     float viewX = e.RawX;// - this.Left; 
         float viewY = e.RawY;// - this.Top; 
         int[] viewCoords = new int[2]; 
         this.GetLocationOnScreen(viewCoords); 
         point.x = viewX - viewCoords[0];// e.RawX; 
         point.y = viewY - viewCoords[1];// e.RawY;