2012-02-14 4 views
0

Я хочу, чтобы действие выполнялось при касании вида. Однако прикосновения не реагируют. Приложение не разбивается, оно просто игнорирует его.Android: OnTouch не отвечает.

public class CustomDrawableView extends View implements OnTouchListener 
{ 
    static final int width = 100; 
    static final int height = 50; 

    public CustomDrawableView(Context context) 
    { 
     super(context); 
     setFocusable(true); 
     setOnTouchListener(mCustomDrawableView);    
     mDrawable = new ShapeDrawable(new OvalShape()); 
     mDrawable.getPaint().setColor(0xff74AC23); 
     mDrawable.setBounds(x, y, x + width, y + height); 
    } 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction()==MotionEvent.ACTION_DOWN) 
     { 

     x = 400; 
     return true; 
     } 
     else { 
      x = 300; 
      return false; 
     } 
    } 

    protected void onDraw(Canvas canvas) 
    {  
     int mCanvasHeight = canvas.getHeight(); 
     int mCanvasWidth = canvas.getWidth(); 
     canvas.save(); 
     canvas.rotate(R,x,y); 


     if (y >= mCanvasHeight-100) { 
      y = 0; 
     } 
     RectF oval = new RectF(x, y, x + width, y 
       + height); // set bounds of rectangle 
     Paint p = new Paint(); // set some paint options 
     p.setColor(Color.BLUE); 
     canvas.drawOval(oval, p); 
     canvas.restore(); 

     invalidate(); 


    } 
} 

Я пробовал кучу разного кода, чтобы исправить это. Ничто из этого не делает ничего, кроме как если я изменю setOnTouchListener (mCustomDrawable) на mCustomDrawableView.setOnTouchListener (это), приложение сработает. В этой деятельности есть еще больше кода, который я не терпел.

+0

Что говорит logcat? – poitroae

ответ

1

Я предполагаю, что вы считаете, что onTouch() не стреляет, потому что вы не видите изменения вашей графики в ответ на изменения в x или что-то еще. Если это так, похоже, что вам не хватает вызова invalidate() в вашем обработчике прикосновений, чтобы заставить View снова перерисовать (по телефону onDraw()).

Кроме того, у вас есть invalidate() собственно внутри onDraw(), который действительно не должен быть там. Это, безусловно, приведет к тому, что ваш View будет перерисовываться снова и снова. Я полагаю, что на самом деле, я думаю, вы должны видеть обновления, потому что это есть. Но это не так, как вы должны сделать анимацию View; вместо этого вы должны использовать Thread или Handler, чтобы запланировать регулярный, периодический invalidate() - или некоторые другие средства для регулярного планирования обновления.

Также не должно быть необходимости использовать «OnTouchListener», если вы можете просто переопределить onTouch(), как вы это делали. Есть несколько способов обнаружения событий касания для View: (1) Переопределите onTouch(), как вы это делали, чтобы получить события касания на этом View. (2) Зарегистрируйте слушателя, используя setOnTouchListener(). Этот последний вариант позволяет вам слушать слушателя, который слушает прикосновение к событиям от одного View или нескольких View s, и он также «видит» события касания, прежде чем их зарегистрирует зарегистрированный собственный onTouch().

Еще одна вещь, которую я вижу, заключается в том, что вы устанавливаете x в 400, когда вы получаете событие ACTION_DOWN, но затем вы устанавливаете его на 300 для любого другого события, такого как ACTION_MOVE. Учитывая, что на самом деле довольно сложно держать палец еще достаточно, чтобы никогда не вызывать последовательность событий ACTION_MOVE сразу после ACTION_DOWN, возможно, вы никогда не видите графику, когда x находится в 400 или что-то в этом роде.

Вам действительно нужно опубликовать полный пример (например, ваш код, который вы опубликовали, имеет setOnTouchListener(mCustomDrawableView), где mCustomDrawableView не определен нигде) вместе с конкретными ошибками Logcat. Кроме того, вы должны использовать отладчик, чтобы проверить, выполнит ли ваш onTouch (вставьте в него контрольную точку).

Кроме того, вы должны принять некоторые ответы.