2015-11-24 3 views
3

Я создаю многоразовый класс, который реализует onclick и метод, который устанавливает onclick. Класс будет представлять «кнопки», которые нарисованы на холсте. Мне известно использование позиций x и y для оценки того, была ли нажата кнопка.Класс Android, реализующий методы OnClick и setOnClick

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

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

public class CanvasButton extends CanvasItem implements View.OnClickListener { 
    private View.OnClickListener ClickListener; 

    public CanvasButton(float x, float y, int width, int height){ 
     super(x, y, width, height); 
    } 

    public boolean isPressed(float x, float y){ 
     return isTouched(x, y); 
    } 

    public void setOnClickListener(View.OnClickListener listener){ 
     this.ClickListener = listener; 
    } 

    @Override 
    public void onClick(View v) { 
    } 
} 

Не может понять, как продолжение

UPDATE: Я думаю, что я дал неправильное представление из прилагаемого кода. Я пытался использовать View.OnClickListener, но это был просто вариант, который, как я думал, у меня был. Любой метод, который ведет себя как прослушиватель onclick, описанный выше, будет делать.

ответ

0

Благодаря @mdtuyen's answer я был в состоянии буровой установки что-то, что работает для меня. я реализовал базовый класс CanvasItem, что теперь я могу унаследовать сделать трюк (я ушел из методов нерелевантного класса)

import android.view.View; 

public class CanvasItem { //notice does not need to implement onClickListener 

    //this is used to get the click 
    private View.OnClickListener onClickListener; 

    protected CanvasItem(){ 
     /* contructor logic goes here */ 
     /* at minimum x and y and width and height is needed */ 
    } 

    protected boolean isHit(float x, float y){ 
     /* left() right() top() and bottom() use widths and height from my constructor */ 
     /* x and y is passed from canvas ontouch */ 
     if(x >= left() && x <= right() && y >= top() && y <= bottom()){ 

      //fire any onclick listeners 
      if(onClickListener != null){ 
       onClickListener.onClick(null); 
      } 

      //return true 
      return true; 
     } 

     //not touched 
     return false; 
    } 

    protected void setOnTouchListener(View.OnClickListener clickListener){ 
     onClickListener = clickListener; 
    } 
} 

После этого реализуется я использовал ArrayList из CanvasItem или класса, который наследует CanvasItem, что выполняется для определения isHit()

public boolean onTouchEvent(MotionEvent event) { 

     final int action = event.getAction(); 

     float x = event.getX(); 
     float y = event.getY(); 

     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       for(CanvasItem itm : mItems){ 
        //if item istouched 
        if(itm.isHit(x, y)){ 
         /* Logic can go here to alter any properties */ 
        } 
       } 
     } 
    } 

Ничто не должно было быть на месте в заявлении, если один раз в item.isHit() вызывается тогда OnClick обжигали.

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

2

OnClick нужно иметь формат, как:

@Override 
public void onClick(View v) { 
    if (ClickListener != null){ 
     ClickListener.onClick(v); 
    } 
    //The code to reuse 
} 
1

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

onClickListener in Canvas

и

add touch event listener to android canvas

public class MyCanvasView extends View implements OnTouchListener { 

    Bitmap button1; 
    Bitmap button2; 
    Bitmap button3; 
    Bitmap button4; 

    public MyCanvasView(Context context) { 
     super(context); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 
     this.setOnTouchListener(this); 
    } 

    public void onDraw(Canvas canvas) { 
     paint = new Paint(); 
     canvas.drawBitmap(button1, 10, 10, paint); 
     canvas.drawBitmap(button2, 60, 10, paint); 
     canvas.drawBitmap(button3, 110, 10, paint); 
     canvas.drawBitmap(button4, 160, 10, paint); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     int x = event.getX(); 
     int y = event.getY(); 
     if (x >= 60 && x <= (60 + canvasButtonWidth)){ 
      if (y >= 10 && x <= (10 + canvasButtonHeight)) { 
       //Insert code you want to use when button2 is clicked 
      } 
     } 
     /*Copy and paste the pair of if statements above for each button you have 
     /drawn on the canvas*/ 
     return true; 
    } 
} 
+0

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

Смежные вопросы