2013-07-06 1 views
0

방금 ​​Android 용 프로그래밍을 시작했습니다. 나는 내 문제를 많이 찾았지만 충고는 나에게 도움이되지 못했다. 터치 좌표에서 동일한 이미지가 화면에 표시되기를 원합니다. 그게 내가 무슨 짓을했는지의 :android, 다중 이미지 뷰 온 터치 이벤트 추가

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    View main_view = (View)findViewById(R.id.main_view); 
    main_view.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      ImageView image = new ImageView(getApplicationContext()); 
      //ImageView image = (ImageView)findViewById(R.id.broken); 
      image.setImageResource(R.drawable.broken); 
      image.setX(event.getX() + image.getWidth()/2); 
      image.setY(event.getY() - image.getHeight()/2); 
      LinearLayout top_layout = (LinearLayout) findViewById(R.id.top_layout); 
      LayoutParams p = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 
      image.setLayoutParams(p); 
      top_layout.addView(image); 

      return true; 
     } 
    }); 
} 

모든 것이 나에게 잘 보이지만, 화면을 터치 할 때 아무 일도 발생하지 않습니다. 내가 만든 분명한 실수는 어디 있니? 미리 감사드립니다.

+0

'이미지 뷰 이미지 = 새로운 이미지 뷰 (getApplicationContext());'당신이 활동 컨텍스트를 사용한다 - '이미지 뷰 이미지 = new ImageView (MyActivity.this);'- MyActivity는 Activity 클래스의 이름입니다. – Simon

+0

코드에서 setX 및 setY 행을 제거하고 다시 시도하십시오. –

+0

xml 레이아웃 파일에 보이지 않는 루트보기가 없습니까? –

답변

1

LinearLayout에서는이를 수행 할 수 없습니다. 대신 FrameLayout을 사용해 보겠습니다.

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/framelayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
</FrameLayout> 

MainActivity.java

public class MainActivity extends Activity { 

    private FrameLayout mLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mLayout = (FrameLayout) findViewById(R.id.framelayout); 
     mLayout.setOnTouchListener(mListener); 

    } 

    private OnTouchListener mListener = new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 

      case MotionEvent.ACTION_DOWN: 
       return true; 

      case MotionEvent.ACTION_UP: 
       // decode the resource to get width and height 
       Options opts = new Options(); 
       opts.inJustDecodeBounds = true; 
       BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher, opts); 

       int imageWidth = opts.outWidth; 
       int imageHeight = opts.outHeight; 

       // set the imageview's top and left margins 
       FrameLayout.LayoutParams lp = new LayoutParams(imageWidth, imageHeight); 
       lp.leftMargin = (int) (event.getX() - (imageWidth/2)); 
       lp.topMargin = (int) (event.getY() - (imageHeight/2)); 

       ImageView image = new ImageView(MainActivity.this); 
       image.setImageResource(R.drawable.ic_launcher); 
       mLayout.addView(image, lp); 

       return false; 

      } 
      return false; 
     } 
    }; 

} 
+0

베니토, 정말 고마워요. 그것은 잘 작동합니다. 유일한 것 (내 의견으로는)은별로 좋지 않습니다. =) OnTouchListener를 다른 클래스에 넣었습니다. – bdshadow

0

setX 및 setY는 이미지 위치를 설정하지 않습니다. 기본적으로 이미지를 제자리에서 스크롤합니다. 위치는 상위 뷰에 의해 제어됩니다. 부모는 선형 레이아웃이기 때문에 레이아웃에서 항상 위쪽 또는 아래쪽에 배치됩니다. 정확히 어딘가에 배치하고 싶다면, 더 이상 사용하지 않는 AbsoluteLayout과 같이 그것을 지원하는 부모에게 넣어야합니다.

+0

첫 번째 진술을 제외하고는 모든 것에 사실상 동의합니다. 문서를 보면 : "public void setX (float x);이 뷰의 시각적 x 위치를 픽셀 단위로 설정합니다." 그러나 이유는 LinearLayout입니다. 감사합니다 – bdshadow

+0

죄송합니다, 그 위치에 대해 이야기하지 않습니다. 저조한 서면 문서에 동의합니다. 그러나 뷰 계층 구조 시스템의 전체적인 점은 결코 절대 x 및 y 위치를 신경 쓰지 않는 것입니다. 뷰가 그것을 계산하는 방법을 알지 못하기 때문에 함수가 참조하는 x와 y는 x 또는 y가 화면 또는 상위를 기준으로하지 않습니다. 죄송합니다. 귀하는 (불량) 문서를 잘못 해석하고있는 것입니다. –

+0

또한 아래의 전체 설명을 읽으십시오. "translationX 속성을 전달 된 x 값과 현재 왼쪽 속성 사이의 차이로 설정하는 것과 같습니다." 뷰의 위치가 아닌 내용의 x 오프셋과 관련이 있습니다. –