2013-05-08 45 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)必须覆盖或实现超法” – 2013-05-09 04:15:25

+0

所以@Override标注添加到onTouch方法 – pskink 2013-05-09 05:43:54

+0

我可以解决这个问题。我只是在构造函数中忘记了这一行。 \t“this.setOnTouchListener(this);” – 2013-05-09 05:53:29

相关问题