2011-01-07 44 views
1

我有一個ImageView在我的Activity中加載圖片,並且想要在其上繪製一些線條,好像我無法覆蓋我繪製到ImageView上的線條。如果我創建了一個新的類(myPainter),它擴展了'View',從activity中掛接myPainter.onDraw(),然後在onCreate()中設置ContentView(mp),我得到的就是繪製的線條。My ImageView從onCreate ()。我如何獲得的ImageView和線相同的佈局展現出來?我也Override'ing onTouch()爲ImageView的,所以我可以從它那裏得到的XY點擊位置。在延伸「活動」的類中繪製線條

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?就像用戶觸摸屏幕的地方一樣。而Android rocketAnimation例如導致異常,如果我將代碼添加到myPainter()類:

@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); 

} 
1

問題是你在呼喚setContentView兩次。你的onCreate應該更像:

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

道歉,但我不知道我理解你的答覆。這隻會顯示ImageView,並且不會在myPaint中觸發onDraw()以獲取頂部繪製的線條。有沒有辦法鉤onDraw()在不*擴展視圖的類?猜猜這可能是一個更好的問題。 – wufoo 2011-01-07 16:20:35

+0

由於您正在擴展View,因此應該像在任何View中那樣自動調用onDraw。在你的onDraw中調用super應該從setContentView(它應該有你的圖像)繪製所有設置,然後在那之後你正在做你的自定義繪圖。 – elevine 2011-01-07 16:45:56