2013-05-08 2 views
2

У меня есть класс, который расширяет «Просмотр» и реализует «OnTouchListener», поэтому он автоматически переопределяет метод ontouch, но этот метод не работает. Я пытаюсь отлаживать поставленную точку останова в этом методе, но он не вызывается.Ontouch() не работает с пользовательским представлением?

Я пытаюсь решить эту проблему с других форумов. они говорят, что onTouch() должен возвращать true; Но это не лучше.

мой класс проблема:

public class Viewer extends View implements OnTouchListener{ 

/** Constant tile width. */ 
public static final int TILEW = 32; 
/** Constant tile height. */ 
public static final int TILEH = 70; 
/** Constant tile shift due to increased level. */ 
public static final int TILESKEW = 7; 
/** Tile images. */ 
private Bitmap[][] tileImages; 
/** Highlighted tile images. */ 
private Bitmap[][] tileImagesHL; 
/** Board itself. */ 
private Board b; 
private Tile[][][] tTile; 
private float screenWidth = Defines.getScreenWidth(); 
private float screenHeight = Defines.getScreenHeight(); 

private float offsetImg = Defines.getOffsetImage(); 
private float reScalePosX = Defines.getReScalePosX(); 
private float reScalePosY = Defines.getReScalePosY(); 

private boolean firstIter; 

/** Stores selected tiles */ 
private ArrayList<Tile> selectedTiles;// = new ArrayList<Tile>(); 

/** Stores highlighted tiles by Hint */ 
private ArrayList<Tile> highlightedTiles;// = new ArrayList<Tile>(); 

////////////////////////////////////////////////// 
private static RectF screen; 
private Images imgObj; 

public Viewer(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    imgObj = new Images(context); 
    b = new MainActivity().board; 

    Defines.setScreenRender(1280, 800);  
    makeTileImages(Board.MAXGROUPS);  
} 

@Override 
protected void onDraw(Canvas canvas){ 
    drawBackGround(imgObj.bg01, canvas);  
    try{ 
     tTile = b.getContent(); 
     if(tTile==null || tileImages==null){ 
      return; 
     } 
     drawTile(tTile, canvas); 


    }catch (Exception e) { 
     // TODO: handle exception      
    } 
} 


@Override 
public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 
    Log.d("Mydebug", "YEHHHHHH"); 
    Tile[][][] content = b.getContent(); 
    for (int i = 0; i < content.length; i++) { 
     for (int y = 0; y < content[i].length; y++) { 
      for (int x = 0; x < content[i][y].length; x++) { 
       processMouseClick(content, i, y , x, event); 
      } 
     } 
    }    
    return true; 
} 



public void drawBackGround(Bitmap bitmapBG,Canvas canvas){  
    screen = new RectF(0.0f, 0.0f, Defines.getScreenWidth(),Defines.getScreenHeight()); 
    canvas.drawBitmap(bitmapBG, null, screen, null); 

} 

private void makeTileImages(int groups){ 
    tileImages = loadTileset(groups, "unlit_"); 
    tileImagesHL = loadTileset(groups, "lit_"); 
} 

private Bitmap[][] loadTileset(int groups,String prefix){ 
    Bitmap[][] tr = new Bitmap[groups][Board.GROUPSIZE];   
    try{ 
     InputStream is = this.getResources().getAssets().open("Tiles/tiles.set"); 
     BufferedReader f = new BufferedReader(new InputStreamReader(is)); 
     String s = f.readLine(); 
     while (s!=null) { 
      if (!s.startsWith("#")) { 
       String[] tokens = s.split(" "); 
       try{ 
        int groupNum =Integer.parseInt(tokens[0]); 
        for(int i =1; i<=(Board.GROUPSIZE);i++){  
          String pathPNG = "Tiles/"+prefix+tokens[i]+".png"; 
          Bitmap img = imgObj.loadImage(pathPNG); 
          img = imgObj.resizeBitmap(img,Tile.tileHeight, Tile.tileWidth); 
          //Bitmap img = loadImage(pathPNG); 
          //Log.d("Mydebug", "PATH:"+pathPNG); 
          tr[groupNum][i-1] = img; 
        }  

       }catch (Exception e) { 
        // TODO: handle exception 
        Log.d("Mydebug", "File error TIles/tile.set"); 
       } 

      } 
      s = f.readLine(); 
     } 
    }catch (Exception e) { 
     // TODO: handle exception 

    }  
    return tr; 
} 


public void drawTile(Tile[][][] content,Canvas canvas){ 
    for (int i = 0; i < content.length; i++) { 
     for (int y = 0; y < content[i].length; y++) { 
      for (int x = 0; x < content[i][y].length; x++) { 
       final Tile t = content[i][y][x]; 
       if (t != null) { 
        if (y>0 && content[i][y-1][x]!=null && t.equals(content[i][y-1][x])) { 
         continue; 
        } 
        if (x>0 && content[i][y][x-1]!=null && t.equals(content[i][y][x-1])) { 
         continue; 
        } 
        Bitmap image = tileImages[t.getValue()][t.getSubindex()]; 

        if (b.free(t)) { 
         image = tileImagesHL[t.getValue()][t.getSubindex()]; 
        }  
         /* Draw tile images to panel */ 
        //canvas.drawBitmap(image, x*TILEW+TILEW/2+i*TILESKEW, (y+1)*TILEH/2-i*TILESKEW, null); 
        canvas.drawBitmap(image, (x*TILEW+TILEW/2+i*TILESKEW)+200, ((y+1)*TILEH/2-i*TILESKEW)+100, null); 

       } 
      } 
     } 
    } 
} 


/** A helper function for the Viewer constructor which accompanies the mouseListener object on each tiles 
* @param content The current board's 3D array of positions 
* @param i The current tile's x position 
* @param y The current tile's y position 
* @param x The current tile's z position 
* @param me The mouseEvent for each tile 
*/ 
private void processMouseClick(Tile[][][] content, int i, int y, int x, MotionEvent touchPos){ 
    final Tile t = content[i][y][x]; 

    if (t != null) { 
     if (y>0 && content[i][y-1][x]!=null && t.equals(content[i][y-1][x])) { 
      return; 
     } 
     if (x>0 && content[i][y][x-1]!=null && t.equals(content[i][y][x-1])) { 
      return; 
     } 

     Bitmap image = tileImages[t.getValue()][t.getSubindex()]; 

     if (b.free(t)) { 
      image = tileImagesHL[t.getValue()][t.getSubindex()];     
     } 


     // Rectangle representing space of tile 
     final Rect rect = new Rect(x*TILEW+TILEW/2+i*TILESKEW, (y+1)*TILEH/2-i*TILESKEW, image.getWidth(), image.getHeight()); 

     //if ((rect.contains(me.getPoint())) && b.free(t) && t.isVisible()) { 
     if ((rect.contains((int)touchPos.getX(), (int)touchPos.getY()) && b.free(t))){ 
      t.wasClicked = true; 
      firstIter = false; 
      Log.d("MyDebug", "Clicked ME"); 
      //if (content[i][y][x].isVisible()){ 
        //Add corresponding JLabel to panel      
      //  t.tLabel.setBounds(x*TILEW+TILEW/2+i*TILESKEW, (y+1)*TILEH/2-i*TILESKEW, image.getWidth(null), image.getHeight(null)); 
      //  t.tLabel.setVisible(false); 
      //  t.tLabel.setBorder(BorderFactory.createLineBorder(Color.blue, 2)); 
      //}    
      //validClick(t); 
     } 
    } 
} 
} 

ответ

5

удалить implements OnTouchListener и переопределить метод:

public boolean onTouch(MotionEvent event) 

обновление

, конечно, это onTouchEvent, не onTouch

+0

спасибо за ваши советы, но я удалить Реализовать OnTouchListener, затем @override общественного логический onTouch (MotionEvent событие) { ........ } это ошибка «Метод onTouch (MotionEvent) типа просмотра необходимо переопределить или реализовать метод Supertype» –

+0

так добавить @Override аннотацию к onTouch метод – pskink

+0

Я могу решить эту проблему. Я просто забыл эту строку в конструкторе. \t "this.setOnTouchListener (this);" –