Рисование линии в классе, который расширяет «Деятельность» - PullRequest
1 голос
/ 07 января 2011

У меня есть ImageView, загружающий изображение в моей деятельности, и я хочу нарисовать на нем несколько линийКажется, я не могу наложить линии, которые я рисую, на ImageView.Если я создаю новый класс (myPainter), который расширяет 'View', подключаю myPainter.onDraw (), а затем устанавливаю onConteate () изConcontentView (mp) из действия, все, что я получаю, это нарисованные линии.Мой ImageView ушел из onCreate ().Как мне заставить ImageView и линии отображаться в одном макете?Я также переопределяю 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);
     }

ОБНОВЛЕНИЕ:

Я думаю, что буквально загнал себя в угол.Как мне добавить frameAnimation к этому коду сейчас в методе onTouchEvent ()?Например, когда пользователь касается экрана.Пример rocketAnimation для Android вызывает исключение, если я добавляю код в класс 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);
  }

Ответы [ 2 ]

1 голос
/ 07 января 2011

Проблема в том, что вы звоните 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 голосов
/ 07 января 2011

Я пытался реализовать приведенные выше предложения, но не смог получить ту функциональность, к которой стремился.Возможно, я не сформулировал свой вопрос полностью или просто общее недоразумение.В итоге я добавил setBackgroundResource () в основной метод myPainter, чтобы получить изображение на экране.Я думаю, что он работает так, как нужно, и публикует код ниже на случай, если это поможет кому-то еще.Спасибо за вашу помощь!

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

}
...