Android Как создавать события onClick в методе Canvas onDraw - PullRequest
1 голос
/ 27 июля 2011

Я искал вокруг и до сих пор не могу найти хороший ответ.Я сделал свой собственный класс, который расширяет imageView и в методе onDraw () я использую canvas для рисования кругов на моем изображении.

Что я хочу сделать сейчас, так это нарисовать кнопку на изображении в разных местах и ​​иметь событие onClick для него, поэтому, когда пользователь нажимает кнопку, он открывает новое действие.

Вот то, что я имею до сих пор .. Он рисует кнопки в правильных местах, за исключением того, что мой метод onClick не срабатывает

@Override
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);

        //1.arrayList Points. 2.arrayLists for points in X, 3.arrayList for points in Y
        for(int i=0; i<arrayListPoints.size(); i++){


             Button b = new Button(mContext);
             LinearLayout ll = new LinearLayout(mContext);
             LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
             layoutParams.setMargins(alPoints_x.get(i), alPoints_y.get(i), 0, 0);

             ll.addView(b, layoutParams);

            //Measure and layout the linear layout before drawing it
             ll.measure(MeasureSpec.getSize(ll.getMeasuredWidth()), MeasureSpec.getSize(ll.getMeasuredHeight()));
             ll.layout(0, 0, MeasureSpec.getSize(b.getMeasuredWidth()), MeasureSpec.getSize(b.getMeasuredHeight()));
             //Finally draw the linear layout on the canvas
             ll.draw(canvas);


            //create an onClick event for the button
            b.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {

                     Toast msg = Toast.makeText(mContext, "button clicked \n", Toast.LENGTH_LONG);
                     msg.show(); 

                 } //end of public void

            });

        }


    invalidate();   

}   //end of onDraw()

1 Ответ

1 голос
/ 27 июля 2011

Я должен сказать, что у этого подхода может быть цель, но я ее не вижу.Почему вы воссоздаете и рисуете макет каждый раз, когда изображение перерисовывается?

Причина, по которой слушатель onClick не работает, заключается в том, что ваш макет никогда не внедряется в контент мероприятий, вы просто рисуете его (что, я бы не подумал, даже сработало бы для творчества).расположение и кнопка не привязаны ни к чему, я почти уверен, что они будут собирать мусор, что, конечно, здесь не имеет значения, просто говорю.

Также это происходит каждый раз, когда вы рисуете свой холст, что не может быть полезным для производительности или памяти.

Есть ли какая-то причина, по которой вы не просто создаете макет со своим изображением и кнопкой, а затем перемещаете кнопку, когда это необходимо.

Если вы настаиваете на этом подходе, единственное «решение», о котором я могу подумать, - это отслеживать прямоугольник кнопки в представлении вашего изображения, а затем проверять, «щелкнуло» ли событие движения внутри областикнопка была нарисована.

Если вы сообщите нам, почему вы пытаетесь это сделать, мы, вероятно, можем предложить лучшее решение, чем эта реализация, которая на самом деле не кажется необходимой или правильной, но у вас может быть веская причина, которую я не могу придуматьиз.

Обновление

Так что я думаю, исходя из ваших комментариев, что вы хотите сделать, это

Поместите контейнер AbsoluteLayout поверх вашей карты (заполните родительский элемент) или просто поместите карту в такой контейнер, в любом случае.

Затем поместите кнопки в этот контейнер макетов (через xml или программно, на самом деле не имеет значения)

Затем установите макет x / y / видимость этих кнопок

...