2013-05-08 119 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

相關問題