2016-07-22 13 views
0

私はカスタムImageViewを実装しました。私の画像が大きいので、ScrollViewとHorizo​​ntalScrollViewを使って画像をスクロールしています。 onTouchイベントでサークルを描きたいのですが、すべてのケースで動作しません。画像と火災のタッチイベントをスクロールすると、x、y座標が画像の現在の表示セクタに適用されます(右上に0x0が表示されますが、somwhereをスクロールすると上隅に表示されますが0x0になります)。画像サイズに応じて 別の問題は、アプリがさまざまな画面サイズで使用できることです。 私はxamarin C#を知っていますが、ネイティブのAndroidでは同じである必要があります。座標を正しく描く/取得する方法は誰でも知っていますか?カスタム画像ビューに対してタッチ座標を取得

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

答えて

0

解決策が見つかりました。ただ、

     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; 

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

を交換

関連する問題