2011-01-07 11 views
1

アクティビティで画像を読み込んでいる画像ビューを持っていて、その上に線を描きたいのですが、ImageViewに描画する線をオーバーレイできないようです私は新しいクラス(myPainter)を作成して 'View'を拡張すると、myPainter.onDraw()とsetContentView(mp)をアクティビティからフックして、描画された線だけを取得しますmy ImageViewはonCreateから削除されています()私は同じレイアウトで表示するIm​​ageViewのと行を取得するにはどうすればよいです。?私もImageViewのためonTouchを()Override'ingてるので、私はそれからの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を追加するにはどうすればよいですか?ユーザーが画面に触れる場所のように。

@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()クラスにコードを追加する場合のAndroid rocketAnimationの例では、例外が発生します。あなたの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()を起動して、上に描画された線を取得しません。 Viewを拡張しないクラスでonDraw()をフックする方法はありますか?おそらくそれはより良い質問だと思います。 – wufoo

+0

Viewを拡張しているので、onDrawは任意のViewと同じように自動的に呼び出されます。あなたのonDrawのsuperへの呼び出しは、setContentView(あなたのイメージを持つはずです)からすべての設定をペイントする必要があります。 – elevine

+0

また、この行は効果的にあなたのために何もしません:myPainter mp = new myPainter(this);既にインスタンス化されたmyPainterの内部にあるので、自分自身への参照を使用して別のインスタンスをインスタンス化する必要はありません。 – elevine

関連する問題