2013-11-28 4 views
0
public class Game_collecting_view extends View 
{ 
    Button image_boy; 
    private static final int BOY_DIAMETER = 200; // initial spot size 
    int boy_width =0; 
    int boy_height =0; 

    public void setGame_collecting(Game_collecting mGame_collecting) 
    { 
     this.mGame_collecting = mGame_collecting; 
    }  

    // constructs a new View 
    public Game_collecting_view(Context context, RelativeLayout parentLayout) 
    {  
     super(context); 
     resources = context.getResources(); // save Resources for loading external values 
     layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     // get references to various GUI components 
     relativeLayout = parentLayout; 
     spotHandler = new Handler(); // used to add spots when game starts 

    } 

    @Override 
    protected void onSizeChanged(int width, int height, int oldw, int oldh) 
    { 
     viewWidth = width; // save the new width 
     viewHeight = height; // save the new height 
    } 

    public void set_boy() 
    { 
      final Button boy = (Button) layoutInflater.inflate(R.layout.untouched, null); 
      boy.setX(viewWidth /2); 
      boy.setY(viewHeight - BOY_DIAMETER); 
      boy.setPadding(0,0,0,0); 
      boy.setBackgroundResource(R.drawable.blue);   
      boy.setLayoutParams(new RelativeLayout.LayoutParams(BOY_DIAMETER, BOY_DIAMETER)); 
      relativeLayout.addView(boy); // add spot to the screen 

      Toast.makeText(getContext(), "set_boy\nviewWidth=" +viewHeight +"\nviewHeight=" +viewHeight, Toast.LENGTH_SHORT).show(); 

      boy.setOnClickListener 
      ( 
      new OnClickListener() 
      {    
       public void onClick(View v) 
       { 
        touchedSpot(boy); 
       } 
      } 
     ); 
    } 

    public void resume(Context context) 
    { 
     resetGame(); 
    } 

    public void resetGame() 
    { 
     for (int i = 1; i <= INITIAL_SPOTS; ++i) 
     { 
      spotHandler.postDelayed(addSpotRunnable, i * SPOT_DELAY); 
      generate_text(); 
     }   
     set_boy(); 
    } 

    private Runnable addSpotRunnable = new Runnable() 
    { 
     public void run() 
     { 
     addNewSpot(); // add a new spot to the game 
     } 
    }; 

Цель:

Я хотел бы установить значок мальчика в нижней средней части экрана. значок мальчик установлен на этом пути для последующего динамического интерфейса (проведите пальцем по экрану справа значок мальчик будет двигаться вправо, наоборот)андроид: установка кнопки программно с помощью Setx и SetY

наблюдения:

тоста отчеты как viewWidth и viewHeight = 0, а значок мальчика - 0,0 (левый верхний угол). Если я установил setY (viewHeight + BOY_DIAMETER), значок мальчика будет расположен в (0, 200).

Вопрос:

Я хотел бы спросить, почему viewWidth и viewHeight как сообщают 0. Как мог onSizeChanged назвать сразу, так что мальчик Icone может быть установлен в центре нижней части экрана?

Спасибо!

+0

http://stackoverflow.com/questions/19932253/get-positions-of-views-in-a-dialog-relativ-to-their-parent/ 19933242 # 19933242 проверьте мой ответ здесь – Naddy

+0

, вы задаете размер слишком рано, прежде чем элементы будут выложены на экране. – njzk2

+0

@ njzk2: правильно вы правы, теперь я использую 'getViewTreeObserver()' для получения 'ViewWidth' и' ViewHeight' перед тем, как пройти через 'setX' и' setY'. Тем не менее, иконка мальчика все еще находится в точке (0,0). Я попытался использовать 'setX (720/2)' и 'setY (1134-200)', вероятно, он расположен в нужном месте. Это означает, что 'viewWidth' и' viewHeight' еще не получены до установки значка мальчика ... таким образом, как я мог отложить позиционирование значка мальчика? с помощью 'Handler'. Как я узнаю, когда измерение будет получено? – pearmak

ответ

0

расположения является нулевым, пока Android не рассчитали свои позиции. Вы можете получить высоту и ширину, как это:

image_boy.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      int height = image_boy.getHeight(); 
      int width = image_boy.getWidth(); 
      //these values won't be null 
     } 
    }); 
+0

Я использовал этот 'getViewTreeObserver()' для получения высоты и ширины relativelayout и теперь работает =) – pearmak

0

набор раскладки параметры для установки положения просмотра

+0

set layout param? 'boy.setLayoutParams (новый RelativeLayout.LayoutParams (BOY_DIAMETER, BOY_DIAMETER));' – pearmak

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