2013-07-19 3 views
1

접촉점에서 ImageView에 원을 그려려고하지만 왼쪽 상단 모서리를 그립니다.접촉 지점에서 ImageView에 원을 그립니다.

내 코드

ImageView imageView; 
    private static int RESULT_LOAD_IMAGE = 1; 
    Bitmap bmp; 
    float touchY; 
    float touchX; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     imageView = (ImageView) findViewById(R.id.imageView1); 
     imageView.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        touchX = event.getX(); 
        touchY = event.getY(); 
        imageView.setImageBitmap(drawCircle()); 
        break; 

       default: 
        break; 
       } 


       return false; 
      } 
     }); 
    } 

    private Bitmap drawCircle() { 
     Bitmap bitmap = bmp.copy(Bitmap.Config.ARGB_4444, true); 
     bitmap.setPixel(imageView.getWidth(), imageView.getHeight(), 0); 
     Canvas canvas = new Canvas(bitmap); 
     Paint paint = new Paint(); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setColor(Color.RED); 
     canvas.drawCircle(touchX, touchY, 100, paint); 
     return bitmap; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.getimage: 
      pickImage(); 
      break; 

     default: 
      break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void pickImage() { 
     Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(intent, RESULT_LOAD_IMAGE); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null){ 
      Uri uri = data.getData(); 
      String[] filePath = {MediaStore.Images.Media.DATA}; 
      Cursor cursor = getContentResolver().query(uri, filePath, null, null, null); 
      cursor.moveToFirst(); 
      int columnIndex = cursor.getColumnIndex(filePath[0]); 
      String picturePath = cursor.getString(columnIndex); 
      cursor.close(); 
      bmp = BitmapFactory.decodeFile(picturePath); 
      imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
     } 
    } 

이며, XML은 내가 잘못 무엇 받고 있지 않다

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:src="@drawable/ic_launcher" /> 

</RelativeLayout> 

입니다. 나는 만지면 서클을 그려야한다. 어떤 도움을 주시면 감사하겠습니다.

답변

1

ImageView의 크기로 새 비트 맵을 만들면이 코드가 정상적으로 작동합니다.

그러나 "bmp"비트 맵은 아마도 ImageView보다 훨씬 크며 크기가 조정됩니다. 그래서 왜곡 된 결과를 얻습니다.

+0

고맙습니다. 솔루션이 저에게 효과적입니다. :) –

관련 문제