Как разместить виды в определенном месте (координаты x, y) - PullRequest
2 голосов
/ 24 августа 2011

У меня проблема с размещением моих представлений (мой класс расширяется View) в определенном месте. Я разработал игру, которая рассматривает экран как сетку. Я получаю от пользователя координаты x и y конкретного вида (у меня есть разные типы видов).

Моя первая миссия - установить правильное изображение на свое место Как мне это сделать? Я использую RelativeLayout для экрана.

P.S. Я не хочу использовать AbsoluteLayout params, потому что он был усечен.

Ответы [ 2 ]

1 голос
/ 24 августа 2011

Это не лучший способ добиться этого, но это решение ...

Создайте класс, который расширяет ваш родительский ViewGroup, скажем RelativeLayout или некоторые другие ViewGroup s. Найдите свой собственный вид в переопределении onFinishInflate().

Переопределите метод onLayout() и вручную создайте собственный вид после вызова super.onLayout().

Наконец, каждый раз, когда вы хотите обновить местоположение вашего собственного вида, просто наберите requestLayout().

Вот пример ниже:

private AwesomeView mMyView;
private int mYourDesiredX;
private int mYourDesiredY;

@Override
public void onFinishInflate() {
    super.onFinishInflate();
    if (mMyView == null) {
        mMyView = (AwesomeView)findViewById();
    }
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    mMyView.layout(mYourDesiredX,
            mYourDesiredY,
            mYourDesiredX + mMyView.getWidth(),
            mYourDesiredY + mMyView.getHeight());
}

Но это не эффективное решение.

Если вы создаете игры, попробуйте SurfaceView или даже GLSurfaceView и нарисуйте объекты самостоятельно с помощью Canvas.

0 голосов
/ 13 марта 2015

Предположим, вы хотите разместить кнопку на экране, и у вас есть 100x60 ячеек в вашей сетке.То есть вы разделили экран на 100x60 ячеек, учитывая количество пикселей по горизонтали и вертикали.В ландшафтном режиме число пикселей ширины будет больше, поэтому рассмотрите возможность деления его на 100, а количество пикселей высоты будет меньше, поэтому разделите его на 60. Поэтому, учитывая, что вы используете TAB с разрешением с разрешением 800x480 пикселей , в ландшафтном режиме - у вас есть 8 пикселей (800/100) на ячейку по горизонтали и 8 пикселей (480/60) на ячейку по вертикали. Коэффициент деления будети наоборот в портретном режиме.

Теперь вы хотите разместить кнопку ширины, скажем 35 ячеек , а высота равна wrap_content в соответствии с текстом на ней и разместить ее в координатах 20,20 (x, y) номер ячейки .Я предоставил метод для достижения этой цели ... И обратите внимание: что бы вы ни рассматривали таким образом или с помощью этой идеи, оно будет в одном месте и будет иметь одинаковые размеры и внешний вид на нескольких разрешениях экрана. [Здесь pix_grid_X = пикселей на ячейку по горизонтали (800/100)] [Similiarly pix_grid_Y = пикселей на ячейку по вертикали (480/60)]

Метод размещениякнопка

public void placeButton(int btnId, int xCordinate, int yCordinate, int btnWidth,
        float fontSize, String btnTextColor, String btnBackgroundColor, String message){



    try{


        int currentApi = Build.VERSION.SDK_INT;
        /** Creating a new Button and setting its properties */
       /**pass context as a parameter for the constructor of the class if ur creating a new class just for placing views on screen,else it can be getBaseContext().*/
        Button btn = new Button(context);
        /**Use to access this view using Id to add any kind of listeners on this view.*/
        btn.setId(btnId);

        btn.setText(message);
        /**Let the text size be in pixels*/
        btn.setTextSize(TypedValue.COMPLEX_UNIT_PX, pixels_grid_X*fontSize);

        if(btnTextColor != null)

        {
            btn.setTextColor(Color.parseColor(btnTextColor));

        }

        int widthInPixel = (int) (btnWidth*pixels_grid_X);
        btn.setWidth(widthInPixel);


        if(btnBackgroundColor != null)
        {

            if(currentApi >= 16){
                btn.setBackground(new ColorDrawable(Color.parseColor(btnBackgroundColor )));
            }
            else
            {
                btn.setBackgroundDrawable(new ColorDrawable(Color.parseColor(btnBackgroundColor )));
            }
            /**Registering for a onTouch listener to provide clicked effect just like a button.
             * To provide a click effect for the custom button*/
            btn.setOnTouchListener(this);
        }
        else
        {   /**If btnBackgroundColor was equal to null, set default properties to that button.*/ 
            btn.setBackgroundResource(android.R.drawable.btn_default);
        }

        /** Providing layout params for the image view.*/
        RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        params1.leftMargin = (int) (xCordinate*pixels_grid_X);
        params1.topMargin = (int) (yCordinate*pixels_grid_Y);
        btn.setLayoutParams(params1);

        /**
         * The parent layout in which the button is to be displayed.
         * Finally adding the button to the parent layout.
         * layout is the reference to ur relative layout.   
         */

        layout.addView(btn,params1);


    }catch(Exception ex){
        ex.printStackTrace();

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...