2011-01-07 4 views
1

내 액티비티에 그림을로드하는 ImageView가 있고 그 위에 선을 그려야합니다. 내가 그린 선을 오버레이 할 수없는 것처럼 보입니다. . 'View'를 확장하는 새로운 클래스 (myPainter)를 만들면 myPainter.onDraw()를 호출 한 다음 activity에서 onCreate()에서 setContentView (mp)를 연결하면 그려진 선이 모두 얻게됩니다. 내 ImageView는 onCreate에서 사라졌습니다.() 나는 같은 레이아웃에 표시하는 이미지 뷰와 선을 어떻게합니까.? 나는 또한 이미지 뷰에 대한 onTouch()를 Override'ing 해요 그래서 그것을에서 XY 클릭 위치를 얻을 수 있습니다."Activity"를 확장하는 클래스에서 선 그리기

public class myPainter extends View 
    { 
    public myPainter (Context context) 
     { 
     super (context); 
     } 

    @Override 
     protected void onDraw(Canvas canvas) 
    { 
     super.onDraw (canvas); 
     Paint p = new Paint(); 
      p.setColor(Color.RED); 

     canvas.drawLine (E_XMIN, E_YMIN, E_XMAX, E_YMAX, p); 
    } 
    } 


    @Override 
    public void onCreate (Bundle savedInstanceState) 
    { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.main); 
     ImageView iv = (ImageView) findViewById(R.id.ImageView01); 
     iv.setOnTouchListener (this); 

// this draws my lines, but I loose the pic above ^^^ 
     myPainter mp = new myPainter(this);   
     setContentView(mp); 
    } 

업데이트 :

나는 내가 구석에 문자 그대로 그림을 그렸다 고 생각한다. 이제 onTouchEvent() 메서드에서이 코드에 frameAnimation을 어떻게 추가합니까? 사용자가 화면을 터치하는 것과 같습니다.

@Override 
    public boolean onTouchEvent (MotionEvent event) 
    { 

     //Log.d (TAG, "touchevent in myPainter"); 
     switch (event.getAction()) 
     { 
      case MotionEvent.ACTION_DOWN: 
        Log.d (TAG, "down x:" + event.getX() + " y:" + event.getY()); 

        int wClick = getClick (event.getX(), event.getY()); 


        AnimationDrawable touchAni; 
        ImageView iv = (ImageView) findViewById (R.drawable.triangle); 
        iv.setBackgroundResource (R.drawable.nova); 
        touchAni = (AnimationDrawable) iv.getBackground(); 
        touchAni.start(); 

        return true; 
     } 

     return super.onTouchEvent (event); 
    } 

답변

0

위 제안을 구현하려고했지만 목표로 삼던 기능을 얻을 수 없었습니다. 아마도 나는 내 질문에 완전히 동의하지 않았을뿐입니다. 아니면 일반적인 오해 일 수도 있습니다. myPainter main 메소드에서 setBackgroundResource()를 추가하여 화면의 이미지를 가져 왔습니다. 나는 그것이 다른 사람을 돕는 경우에 대비하여 필요할 때 작동하고 아래 코드를 게시한다고 생각합니다. 도와 주셔서 감사합니다!

class myPainter extends View implements myConst 
    { 
     private final static String TAG = "** myPainter **"; 

     public myPainter (Context context) 
     { 
      super (context);  
      Log.d (TAG, "new myPainter"); 
      setBackgroundResource (R.drawable.triangle); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) 
     { 
      super.onDraw (canvas);  
      Log.d (TAG, "new myPainter"); 

      Paint p = new Paint(); 
      p.setColor (Color.RED); 
      canvas.drawLine (E_XMIN, E_YMIN, E_XMAX, E_YMIN, p); 
     } 


     /** 
     * called to determine what part of the triangle was clicked 
     * @param x 
     * @param y 
     * @return click id from myConst 
     */ 
     private int getClick (float x, float y) 
     { 
      int id = 0; 
       // insert logic to test x,y locations and return 
       // region ID of what was clicked 
       ... 

      return (id); 
     } 

     @Override 
     public boolean onTouchEvent (MotionEvent event) 
     { 
      Log.d (TAG, "touchevent in myPainter"); 
switch (event.getAction()) 
      { 
       case MotionEvent.ACTION_DOWN: 
         Log.d (TAG, "down x:" + event.getX() + " y:" + event.getY()); 

         int wClick = getClick (event.getX(), event.getY()); 
       break; 
      } 

      return false; 
     } 

    } 

그리고 내 주요 응용 프로그램 클래스에서 onCreate()이 있습니다

/** Called when the activity is first created. */ 
@Override 
public void onCreate (Bundle savedInstanceState) 
{ 
    super.onCreate (savedInstanceState); 
    setContentView (R.layout.main); 

    myPainter mp = new myPainter(getApplicationContext()); 
    mp.invalidate(); 
    setContentView(mp); 

    //ImageView iv = (ImageView) findViewById(R.id.ImageView01); 
    //iv.setOnTouchListener (this); 

} 
+0

무엇이'myConst'입니까? 그리고 어디에서'E_XMIN, E_YMIN' 등을 얻었습니까 – ThisGuy

+0

'R.layout.main'을 통해 그려지지 않습니다. 방금 기본적으로'setContentView'를 변경했습니다. 'layout.main'은 보이지 않습니다. 당신은 단지 그것의 위에'myPainter'를 놓습니다. – ThisGuy

1

문제는 두 번 setContentView을 요구하고있다 : 나는 myPainter() 클래스에 코드를 추가 할 경우 안드로이드 rocketAnimation 예제에서는 예외가 발생합니다. 귀하의 onCreate는 다음과 같아야합니다 :

+0

죄송합니다,하지만 난 당신의 대답을 이해 모르겠어요. 이 경우에만 ImageView가 표시되고 myPaint에서 onDraw()가 실행되지 않으므로 맨 위에 그려진 선이 표시됩니다. 보기를 확장하지 * 않는 클래스에서 onDraw()를 연결하는 방법이 있습니까? 어쩌면 그게 더 좋은 질문 일거야. – wufoo

+0

View를 확장하고 있으므로 onDraw는 모든보기에서와 같이 자동으로 호출되어야합니다. onDraw의 super 호출은 setContentView (이미지가 있어야 함)에서 모든 설정을 그려야합니다. 그런 다음 그 지점 이후에 사용자 정의 도면을 수행하고 있습니다. – elevine

+0

또한,이 행은 효과적으로 당신을 위해 아무것도하지 않습니다 : myPainter mp = new myPainter (this); 이미 인스턴스화 된 myPainter 안에 있으므로, 참조로 다른 인스턴스를 인스턴스화 할 필요가 없습니다. – elevine